# app/__init__.py import click from flask import Flask from flask.cli import with_appcontext from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from werkzeug.middleware.proxy_fix import ProxyFix from sqlalchemy import event from sqlalchemy.engine import Engine import sqlite3 db = SQLAlchemy() migrate = Migrate() # ============================================================================= # CLI Commands # ============================================================================= @click.command("version-check") @with_appcontext def version_check_command(): """Check app version and run data migrations if needed (e.g., phash recomputation).""" from app.utils.version_migration import check_and_run_migrations check_and_run_migrations() @event.listens_for(Engine, "connect") def set_sqlite_pragma(dbapi_connection, connection_record): # Only apply to SQLite connections if isinstance(dbapi_connection, sqlite3.Connection): cursor = dbapi_connection.cursor() cursor.execute("PRAGMA foreign_keys = ON") cursor.close() def create_app(config_class='config.Config'): app = Flask(__name__) app.config.from_object(config_class) app.config['SQLALCHEMY_ENGINE_OPTIONS'] = { "pool_pre_ping": True } db.init_app(app) migrate.init_app(app, db) app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_port=1) from app.main import main app.register_blueprint(main) @app.template_filter('datetimeformat') def datetimeformat(value, format="%Y-%m-%d"): return value.strftime(format) if value else "" # Register CLI commands app.cli.add_command(version_check_command) return app