aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gn_auth/__init__.py18
-rw-r--r--scripts/gn_auth_wsgi.py (renamed from main.py)37
-rw-r--r--wsgi.py7
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()