diff options
-rw-r--r-- | gn_auth/__init__.py | 18 | ||||
-rw-r--r-- | scripts/gn_auth_wsgi.py (renamed from main.py) | 37 | ||||
-rw-r--r-- | wsgi.py | 7 |
3 files changed, 41 insertions, 21 deletions
diff --git a/gn_auth/__init__.py b/gn_auth/__init__.py index 881ae1e..895f593 100644 --- a/gn_auth/__init__.py +++ b/gn_auth/__init__.py @@ -1,9 +1,8 @@ """Application initialisation module.""" import os import sys -import logging from pathlib import Path -from typing import Optional +from typing import Optional, Callable from flask import Flask from flask_cors import CORS @@ -38,14 +37,6 @@ def override_settings_with_envvars( for setting in (key for key in app.config if key not in ignore): app.config[setting] = os.environ.get(setting) or app.config[setting] -def setup_logging_handlers(app: Flask) -> None: - """Setup the loggging handlers.""" - stderr_handler = logging.StreamHandler(stream=sys.stderr) - app.logger.addHandler(stderr_handler) - - root_logger = logging.getLogger() - root_logger.addHandler(stderr_handler) - root_logger.setLevel(app.config["LOGLEVEL"]) def load_secrets_conf(app: Flask) -> None: """Load the secrets file.""" @@ -78,7 +69,10 @@ def parse_ssl_keys(app): app.config["SSL_PRIVATE_KEY"] = __parse_key__( Path(app.config["SSL_PRIVATE_KEY"])) -def create_app(config: Optional[dict] = None) -> Flask: +def create_app( + config: Optional[dict] = None, + setup_logging: Callable[[Flask], None] = lambda appl: None +) -> Flask: """Create and return a new flask application.""" app = Flask(__name__) @@ -96,9 +90,9 @@ def create_app(config: Optional[dict] = None) -> Flask: parse_ssl_keys(app) # ====== END: Setup configuration ====== + setup_logging(app) check_mandatory_settings(app) - setup_logging_handlers(app) setup_oauth2_server(app) CORS( diff --git a/main.py b/scripts/gn_auth_wsgi.py index ae4b4a1..1de0b56 100644 --- a/main.py +++ b/scripts/gn_auth_wsgi.py @@ -1,13 +1,16 @@ """Main entry point for project""" +import os import sys import uuid import json +import logging from math import ceil from pathlib import Path +from typing import Callable from datetime import datetime - import click +from flask import Flask from yoyo import get_backend, read_migrations from gn_auth import migrations @@ -22,7 +25,37 @@ from gn_auth.auth.authorisation.users.admin.models import make_sys_admin from scripts import register_sys_admin as rsysadm# type: ignore[import] from scripts import migrate_existing_data as med# type: ignore[import] -app = create_app() + +def dev_loggers(appl: Flask) -> None: + """Setup the logging handlers.""" + stderr_handler = logging.StreamHandler(stream=sys.stderr) + appl.logger.addHandler(stderr_handler) + + root_logger = logging.getLogger() + root_logger.addHandler(stderr_handler) + root_logger.setLevel(appl.config["LOGLEVEL"]) + + +def gunicorn_loggers(appl: Flask) -> None: + """Use gunicorn logging handlers for the application.""" + logger = logging.getLogger("gunicorn.error") + appl.logger.handlers = logger.handlers + appl.logger.setLevel(logger.level) + + +def setup_loggers() -> Callable[[Flask], None]: + """ + Setup the loggers according to the WSGI server used to run the application. + """ + # https://datatracker.ietf.org/doc/html/draft-coar-cgi-v11-03#section-4.1.17 + # https://wsgi.readthedocs.io/en/latest/proposals-2.0.html#making-some-keys-required + # https://peps.python.org/pep-3333/#id4 + software, *_version_and_comments = os.environ.get( + "SERVER_SOFTWARE", "").split('/') + return gunicorn_loggers if bool(software) else dev_loggers + +# app = create_app() +app = create_app(setup_logging=setup_loggers()) ##### BEGIN: CLI Commands ##### diff --git a/wsgi.py b/wsgi.py deleted file mode 100644 index c44cb8a..0000000 --- a/wsgi.py +++ /dev/null @@ -1,7 +0,0 @@ -"""WSGI application entry-point.""" -from gn_auth import create_app - -app = create_app() - -if __name__ == "__main__": - app.run() |