Files @ 188deab9696b
Branch filter:

Location: C3L-NOC/spaceapi/spaceapi/__init__.py

Dennis Fink
Add typing annotation, fix some bugs and update to newest version of Flask
import base64
import json
import logging
import logging.handlers
import os.path
import secrets

from flask import Flask, Response
from flask_bootstrap import Bootstrap

bootstrap = Bootstrap()

logging_debug_string = (
    "%(levelname)s:%(name)s:%(asctime)s:%(filename)s" ":%(lineno)d: %(message)s"
)
logging_string = "%(levelname)s - %(name)s - %(asctime)s - %(message)s"
logging_debug_formatter = logging.Formatter(logging_debug_string)
logging_formatter = logging.Formatter(logging_string)


def create_app() -> Flask:
    app = Flask(__name__)

    config_file = (
        os.path.abspath("config.json")
        if app.debug
        else os.path.abspath("/etc/spaceapi.json")
    )

    try:
        app.config.from_file(config_file, load=json.load)
    except FileNotFoundError:
        pass

    _default_secret_key = base64.b64encode(secrets.token_bytes()).decode("utf-8")
    app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY", _default_secret_key)

    app.config.setdefault("BOOTSTRAP_SERVE_LOCAL", True)

    bootstrap.init_app(app)

    app.logger.setLevel(logging.DEBUG)
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.DEBUG)
    stream_handler.setFormatter(logging_debug_formatter)

    if not os.path.exists("spaceapi.log"):
        open("spaceapi.log", mode="a").close()

    rotating_file_handler = logging.handlers.RotatingFileHandler(
        "spaceapi.log", maxBytes=1300000, backupCount=10, encoding="utf-8"
    )
    rotating_file_handler.setLevel(logging.INFO)
    rotating_file_handler.setFormatter(logging_formatter)

    if app.debug or (
        "ENABLE_DEBUG_LOG" in app.config and app.config["ENABLE_DEBUG_LOG"]
    ):

        if not os.path.exists("spaceapi_debug.log"):
            open("spaceapi_debug.log", mode="a").close()

        second_rotating_file_handler = logging.handlers.RotatingFileHandler(
            "spaceapi_debug.log", maxBytes=1300000, backupCount=20, encoding="utf-8"
        )
        second_rotating_file_handler.setLevel(logging.DEBUG)
        second_rotating_file_handler.setFormatter(logging_debug_formatter)
        app.logger.addHandler(second_rotating_file_handler)

    app.logger.addHandler(stream_handler)
    app.logger.addHandler(rotating_file_handler)

    @app.after_request
    def add_headers(response: Response) -> Response:
        response.headers.setdefault("Access-Control-Allow-Origin", "*")
        response.headers.setdefault("Cache-Control", "no-cache")

        return response

    from .views import root_views

    app.register_blueprint(root_views)

    from .sensors import sensors_views

    app.register_blueprint(sensors_views, url_prefix="/sensors")

    from .utils import ActiveStatusv14

    ActiveStatusv14().reload()

    return app