2025-04-06 23:31:14 +00:00
|
|
|
from flask import Flask, g, request, url_for
|
2025-04-06 22:29:00 +00:00
|
|
|
import time
|
2025-03-27 21:19:40 +00:00
|
|
|
import os
|
2025-04-06 22:19:05 +00:00
|
|
|
from app.MRE import blueprint as mre_blueprint
|
2025-04-06 22:05:40 +00:00
|
|
|
from .api import blueprint as api_blueprint
|
|
|
|
|
from logging import Logger, Formatter, getLogger, DEBUG, INFO, FileHandler
|
2025-03-27 21:19:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_config_from_environ(app: Flask) -> Flask:
|
2025-03-27 21:30:17 +00:00
|
|
|
for env_var in filter(lambda x: x.startswith(app.name.upper()), os.environ.keys()):
|
2025-03-27 21:19:40 +00:00
|
|
|
config_name = env_var[len(app.name):]
|
|
|
|
|
app.config[config_name] = os.environ[env_var]
|
|
|
|
|
|
|
|
|
|
return app
|
|
|
|
|
|
|
|
|
|
|
2025-03-27 21:20:36 +00:00
|
|
|
def init_logger(app: Flask, log_level=INFO) -> Flask:
|
2025-03-27 21:30:17 +00:00
|
|
|
logger = getLogger(app.name)
|
2025-03-27 21:19:40 +00:00
|
|
|
formatter = Formatter(f'[%(asctime)s] {app.name.upper()} %(levelname)s: %(message)s (%(filename)s.%(funcName)s)')
|
|
|
|
|
logger.setLevel(log_level)
|
2025-03-27 21:34:49 +00:00
|
|
|
to_file = FileHandler(os.environ.get('MRE_LOG_PATH', f'./{app.name}.log'))
|
2025-03-27 21:30:17 +00:00
|
|
|
to_file.setFormatter(formatter)
|
2025-03-27 21:19:40 +00:00
|
|
|
logger.addHandler(to_file)
|
2025-04-06 22:29:35 +00:00
|
|
|
|
2025-03-27 21:19:40 +00:00
|
|
|
app.logger = logger
|
2025-04-06 22:29:35 +00:00
|
|
|
|
2025-03-27 21:20:36 +00:00
|
|
|
return app
|
2025-03-27 21:19:40 +00:00
|
|
|
|
|
|
|
|
|
2025-03-27 21:30:17 +00:00
|
|
|
def create_app(app_name: str='MRE') -> Flask:
|
|
|
|
|
app = Flask(app_name)
|
2025-03-27 21:19:40 +00:00
|
|
|
app = load_config_from_environ(app)
|
2025-03-27 21:20:36 +00:00
|
|
|
app = init_logger(app)
|
2025-03-27 21:19:40 +00:00
|
|
|
|
2025-03-27 22:06:01 +00:00
|
|
|
app.register_blueprint(mre_blueprint)
|
2025-04-06 23:55:47 +00:00
|
|
|
app.register_blueprint(api_blueprint, url_prefix='/api')
|
2025-04-06 22:29:00 +00:00
|
|
|
|
|
|
|
|
@app.before_request
|
|
|
|
|
def before_request():
|
|
|
|
|
g.start = time.time()
|
|
|
|
|
|
|
|
|
|
@app.after_request
|
|
|
|
|
def after_request(response):
|
|
|
|
|
request_time = time.time() - g.start
|
|
|
|
|
app.logger.info(f'HTTP request completed (method={request.method}, path={request.path}, request_time={request_time}, status_code={response.status_code}).')
|
|
|
|
|
return response
|
2025-03-27 22:06:01 +00:00
|
|
|
|
2025-04-06 23:52:57 +00:00
|
|
|
# def has_no_empty_params(rule):
|
|
|
|
|
# defaults = rule.defaults if rule.defaults is not None else ()
|
|
|
|
|
# arguments = rule.arguments if rule.arguments is not None else ()
|
|
|
|
|
# return len(defaults) >= len(arguments)
|
|
|
|
|
#
|
|
|
|
|
# @app.route('/ping')
|
|
|
|
|
# def ping():
|
|
|
|
|
# links = []
|
|
|
|
|
# for rule in app.url_map.iter_rules():
|
|
|
|
|
# if "GET" in rule.methods and has_no_empty_params(rule):
|
|
|
|
|
# url = url_for(rule.endpoint, **(rule.defaults or {}))
|
|
|
|
|
# links.append(url)
|
|
|
|
|
# app.logger.info(f'Endpoint: {url}')
|
|
|
|
|
# return {'links': links}, 200
|
2025-04-06 23:31:14 +00:00
|
|
|
|
2025-03-27 21:19:40 +00:00
|
|
|
return app
|