""" 卖相AI - Flask 后端 按功能拆分为蓝图:认证(auth)、主页面(main)、管理员(admin)、图片(image)、品牌(brand) """ import os import secrets from datetime import timedelta from flask import Flask from flask_cors import CORS from app_common import init_db, BASE_DIR from blueprints.auth import auth_bp from blueprints.main import main_bp from blueprints.admin import admin_bp from blueprints.image import image_bp from blueprints.brand import brand_bp from blueprints.communication import communication_bp def create_app(): app = Flask(__name__, template_folder=BASE_DIR, static_folder=BASE_DIR) frontend_origin = os.environ.get('FRONTEND_ORIGIN', '*') cors_origins = frontend_origin if frontend_origin != '*' else '*' CORS( app, supports_credentials=True, resources={r"/api/*": {"origins": cors_origins}, r"/login": {"origins": cors_origins}}, ) # 生产环境必须通过环境变量注入固定 SECRET_KEY;否则服务重启会使旧会话失效。 app.secret_key = os.environ.get('SECRET_KEY', 'dev-secret-key-change-me') app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) app.config['SESSION_COOKIE_HTTPONLY'] = True app.config['SESSION_COOKIE_SAMESITE'] = os.environ.get('SESSION_COOKIE_SAMESITE', 'Lax') app.config['SESSION_COOKIE_SECURE'] = os.environ.get('SESSION_COOKIE_SECURE', '0') == '1' # 注册蓝图(不设 url_prefix,保持原有 URL 路径不变,前端无需改动) app.register_blueprint(auth_bp) app.register_blueprint(main_bp) app.register_blueprint(admin_bp) app.register_blueprint(image_bp) app.register_blueprint(brand_bp) app.register_blueprint(communication_bp) return app app = create_app() def run_app(host='127.0.0.1', port=5123): # init_db() app.run(host=host, port=port, threaded=True, use_reloader=False) if __name__ == '__main__': run_app()