Team Ai
Apppublic

Underground-Digital/Workflow-Engine

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
app_factory.py177 linesDownload Raw Back to api
1import os2 3if os.environ.get("DEBUG", "false").lower() != "true":4    from gevent import monkey5 6    monkey.patch_all()7 8    import grpc.experimental.gevent9 10    grpc.experimental.gevent.init_gevent()11 12import json13 14from flask import Flask, Response, request15from flask_cors import CORS16from werkzeug.exceptions import Unauthorized17 18import contexts19from commands import register_commands20from configs import dify_config21from extensions import (22    ext_celery,23    ext_code_based_extension,24    ext_compress,25    ext_database,26    ext_hosting_provider,27    ext_logging,28    ext_login,29    ext_mail,30    ext_migrate,31    ext_proxy_fix,32    ext_redis,33    ext_sentry,34    ext_storage,35)36from extensions.ext_database import db37from extensions.ext_login import login_manager38from libs.passport import PassportService39from services.account_service import AccountService40 41 42class DifyApp(Flask):43    pass44 45 46# ----------------------------47# Application Factory Function48# ----------------------------49def create_flask_app_with_configs() -> Flask:50    """51    create a raw flask app52    with configs loaded from .env file53    """54    dify_app = DifyApp(__name__)55    dify_app.config.from_mapping(dify_config.model_dump())56 57    # populate configs into system environment variables58    for key, value in dify_app.config.items():59        if isinstance(value, str):60            os.environ[key] = value61        elif isinstance(value, int | float | bool):62            os.environ[key] = str(value)63        elif value is None:64            os.environ[key] = ""65 66    return dify_app67 68 69def create_app() -> Flask:70    app = create_flask_app_with_configs()71    app.secret_key = dify_config.SECRET_KEY72    initialize_extensions(app)73    register_blueprints(app)74    register_commands(app)75 76    return app77 78 79def initialize_extensions(app):80    # Since the application instance is now created, pass it to each Flask81    # extension instance to bind it to the Flask application instance (app)82    ext_logging.init_app(app)83    ext_compress.init_app(app)84    ext_code_based_extension.init()85    ext_database.init_app(app)86    ext_migrate.init(app, db)87    ext_redis.init_app(app)88    ext_storage.init_app(app)89    ext_celery.init_app(app)90    ext_login.init_app(app)91    ext_mail.init_app(app)92    ext_hosting_provider.init_app(app)93    ext_sentry.init_app(app)94    ext_proxy_fix.init_app(app)95 96 97# Flask-Login configuration98@login_manager.request_loader99def load_user_from_request(request_from_flask_login):100    """Load user based on the request."""101    if request.blueprint not in {"console", "inner_api"}:102        return None103    # Check if the user_id contains a dot, indicating the old format104    auth_header = request.headers.get("Authorization", "")105    if not auth_header:106        auth_token = request.args.get("_token")107        if not auth_token:108            raise Unauthorized("Invalid Authorization token.")109    else:110        if " " not in auth_header:111            raise Unauthorized("Invalid Authorization header format. Expected 'Bearer <api-key>' format.")112        auth_scheme, auth_token = auth_header.split(None, 1)113        auth_scheme = auth_scheme.lower()114        if auth_scheme != "bearer":115            raise Unauthorized("Invalid Authorization header format. Expected 'Bearer <api-key>' format.")116 117    decoded = PassportService().verify(auth_token)118    user_id = decoded.get("user_id")119 120    logged_in_account = AccountService.load_logged_in_account(account_id=user_id)121    if logged_in_account:122        contexts.tenant_id.set(logged_in_account.current_tenant_id)123    return logged_in_account124 125 126@login_manager.unauthorized_handler127def unauthorized_handler():128    """Handle unauthorized requests."""129    return Response(130        json.dumps({"code": "unauthorized", "message": "Unauthorized."}),131        status=401,132        content_type="application/json",133    )134 135 136# register blueprint routers137def register_blueprints(app):138    from controllers.console import bp as console_app_bp139    from controllers.files import bp as files_bp140    from controllers.inner_api import bp as inner_api_bp141    from controllers.service_api import bp as service_api_bp142    from controllers.web import bp as web_bp143 144    CORS(145        service_api_bp,146        allow_headers=["Content-Type", "Authorization", "X-App-Code"],147        methods=["GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH"],148    )149    app.register_blueprint(service_api_bp)150 151    CORS(152        web_bp,153        resources={r"/*": {"origins": dify_config.WEB_API_CORS_ALLOW_ORIGINS}},154        supports_credentials=True,155        allow_headers=["Content-Type", "Authorization", "X-App-Code"],156        methods=["GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH"],157        expose_headers=["X-Version", "X-Env"],158    )159 160    app.register_blueprint(web_bp)161 162    CORS(163        console_app_bp,164        resources={r"/*": {"origins": dify_config.CONSOLE_CORS_ALLOW_ORIGINS}},165        supports_credentials=True,166        allow_headers=["Content-Type", "Authorization"],167        methods=["GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH"],168        expose_headers=["X-Version", "X-Env"],169    )170 171    app.register_blueprint(console_app_bp)172 173    CORS(files_bp, allow_headers=["Content-Type"], methods=["GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH"])174    app.register_blueprint(files_bp)175 176    app.register_blueprint(inner_api_bp)177