import os from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_bcrypt import Bcrypt from flask_login import LoginManager from flask_compress import Compress from flask_minify import Minify # Initialize Flask extensions db = SQLAlchemy() migrate = Migrate() bcrypt = Bcrypt() login_manager = LoginManager() compress = Compress() minify = Minify(html=True, js=True, cssless=True, fail_safe=True) login_manager.login_view = 'auth.login' login_manager.login_message_category = 'info' def create_app(): app = Flask(__name__) # Load configuration config_name = os.getenv('FLASK_CONFIG', 'DevelopmentConfig') # Default to DevelopmentConfig app.config.from_object(f'app.config.{config_name}') # Fingerprinted URLs allow long-lived static caching across releases. import hashlib from pathlib import Path from flask import url_for asset_versions = {} for filename in ('css/tailwind.css', 'js/diy-turbo.min.js', 'images/favicon.svg'): asset_versions[filename] = hashlib.sha256((Path(app.static_folder) / filename).read_bytes()).hexdigest()[:12] @app.context_processor def asset_helpers(): return {'asset_url': lambda filename: url_for('static', filename=filename, v=asset_versions.get(filename, ''))} @app.after_request def cache_policy(response): from flask import request from flask_login import current_user if request.endpoint == 'static' and request.args.get('v') == asset_versions.get(request.view_args.get('filename')): response.headers['Cache-Control'] = 'public, max-age=31536000, immutable' elif current_user.is_authenticated: response.headers['Cache-Control'] = 'private, no-store' return response # Initialize extensions db.init_app(app) migrate.init_app(app, db) bcrypt.init_app(app) login_manager.init_app(app) compress.init_app(app) minify.init_app(app) # Import models here to avoid circular imports from app.models import User # Import the User model # Set up the user_loader function @login_manager.user_loader def load_user(user_id): return db.session.get(User, int(user_id)) # Register blueprints from app.routes.auth import auth from app.routes.data import data from app.routes.main import main from app.routes.user import user from app.routes.reading import reading app.register_blueprint(main, url_prefix='/') app.register_blueprint(auth, url_prefix='/auth') app.register_blueprint(user, url_prefix='/user') app.register_blueprint(data, url_prefix="/data") app.register_blueprint(reading, url_prefix="/reading") return app