from flask import Flask, g, request, url_for import time import os from app.MRE import blueprint as mre_blueprint from .api import blueprint as api_blueprint from logging import Logger, Formatter, getLogger, DEBUG, INFO, FileHandler def load_config_from_environ(app: Flask) -> Flask: for env_var in filter(lambda x: x.startswith(app.name.upper()), os.environ.keys()): config_name = env_var[len(app.name):] app.config[config_name] = os.environ[env_var] return app def init_logger(app: Flask, log_level=INFO) -> Flask: logger = getLogger(app.name) formatter = Formatter(f'[%(asctime)s] {app.name.upper()} %(levelname)s: %(message)s (%(filename)s.%(funcName)s)') logger.setLevel(log_level) to_file = FileHandler(os.environ.get('MRE_LOG_PATH', f'./{app.name}.log')) to_file.setFormatter(formatter) logger.addHandler(to_file) app.logger = logger return app def create_app(app_name: str='MRE') -> Flask: app = Flask(app_name) app = load_config_from_environ(app) app = init_logger(app) app.register_blueprint(mre_blueprint) app.register_blueprint(api_blueprint, url_prefix='/api') @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 # 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 return app