BrickTracker/bricktracker/app.py

102 lines
2.9 KiB
Python
Raw Permalink Normal View History

2025-01-17 11:03:00 +01:00
import logging
import sys
import time
from zoneinfo import ZoneInfo
from flask import current_app, Flask, g
from werkzeug.middleware.proxy_fix import ProxyFix
from bricktracker.configuration_list import BrickConfigurationList
from bricktracker.login import LoginManager
from bricktracker.navbar import Navbar
from bricktracker.sql import close
from bricktracker.version import __version__
from bricktracker.views.add import add_page
from bricktracker.views.admin import admin_page
from bricktracker.views.error import error_404
from bricktracker.views.index import index_page
from bricktracker.views.instructions import instructions_page
from bricktracker.views.login import login_page
from bricktracker.views.minifigure import minifigure_page
from bricktracker.views.part import part_page
from bricktracker.views.set import set_page
from bricktracker.views.wish import wish_page
def setup_app(app: Flask) -> None:
# Load the configuration
BrickConfigurationList(app)
# Set the logging level
if app.config['DEBUG'].value:
logging.basicConfig(
stream=sys.stdout,
level=logging.DEBUG,
format='[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s', # noqa: E501
)
else:
logging.basicConfig(
stream=sys.stdout,
level=logging.INFO,
format='[%(asctime)s] %(levelname)s - %(message)s',
)
# Load the navbar
Navbar(app)
# Setup the login manager
LoginManager(app)
# I don't know :-)
app.wsgi_app = ProxyFix(
app.wsgi_app,
x_for=1,
x_proto=1,
x_host=1,
x_port=1,
x_prefix=1,
)
# Register errors
app.register_error_handler(404, error_404)
# Register routes
app.register_blueprint(add_page)
app.register_blueprint(admin_page)
app.register_blueprint(index_page)
app.register_blueprint(instructions_page)
app.register_blueprint(login_page)
app.register_blueprint(minifigure_page)
app.register_blueprint(part_page)
app.register_blueprint(set_page)
app.register_blueprint(wish_page)
# An helper to make global variables available to the
# request
@app.before_request
def before_request() -> None:
def request_time() -> str:
elapsed = time.time() - g.request_start_time
if elapsed < 1:
return '{elapsed:.0f}ms'.format(elapsed=elapsed*1000)
else:
return '{elapsed:.2f}s'.format(elapsed=elapsed)
# Login manager
g.login = LoginManager
# Execution time
g.request_start_time = time.time()
g.request_time = request_time
# Register the timezone
g.timezone = ZoneInfo(current_app.config['TIMEZONE'].value)
# Version
g.version = __version__
# Make sure all connections are closed at the end
@app.teardown_appcontext
def close_connections(exception, /) -> None:
close()