51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
|
|
"""Flask application factory."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from datetime import timedelta
|
||
|
|
|
||
|
|
from flask import Flask, jsonify
|
||
|
|
from flask.typing import ResponseReturnValue
|
||
|
|
|
||
|
|
from mimic.api import register_blueprints
|
||
|
|
from mimic.auth.identity import load_user
|
||
|
|
from mimic.config import Settings, get_settings
|
||
|
|
from mimic.extensions import db, login_manager, migrate, socketio
|
||
|
|
from mimic.logging import configure_logging
|
||
|
|
|
||
|
|
|
||
|
|
def create_app(settings: Settings | None = None) -> Flask:
|
||
|
|
settings = settings or get_settings()
|
||
|
|
configure_logging(settings.log_level, as_json=settings.log_json)
|
||
|
|
|
||
|
|
app = Flask(__name__)
|
||
|
|
app.config.update(
|
||
|
|
SECRET_KEY=settings.secret_key.get_secret_value(),
|
||
|
|
SQLALCHEMY_DATABASE_URI=settings.database_url,
|
||
|
|
SQLALCHEMY_TRACK_MODIFICATIONS=False,
|
||
|
|
SESSION_COOKIE_SECURE=settings.session_cookie_secure,
|
||
|
|
SESSION_COOKIE_SAMESITE=settings.session_cookie_samesite,
|
||
|
|
SESSION_COOKIE_HTTPONLY=True,
|
||
|
|
PERMANENT_SESSION_LIFETIME=timedelta(minutes=settings.session_lifetime_minutes),
|
||
|
|
MIMIC_SETTINGS=settings,
|
||
|
|
)
|
||
|
|
|
||
|
|
db.init_app(app)
|
||
|
|
migrate.init_app(app, db, directory="src/mimic/db/migrations")
|
||
|
|
login_manager.init_app(app)
|
||
|
|
login_manager.user_loader(load_user) # type: ignore[arg-type]
|
||
|
|
|
||
|
|
socketio.init_app(
|
||
|
|
app,
|
||
|
|
cors_allowed_origins=settings.cors_origins or "*",
|
||
|
|
async_mode="gevent",
|
||
|
|
)
|
||
|
|
|
||
|
|
register_blueprints(app)
|
||
|
|
|
||
|
|
@app.get("/healthz")
|
||
|
|
def healthz() -> ResponseReturnValue:
|
||
|
|
return jsonify(status="ok"), 200
|
||
|
|
|
||
|
|
return app
|