1.Dify后端源码目录结构
Dify 后端源码的目录结构和各目录的功能,如下所示:
2.Dify中的Blueprint
Flask 中的蓝图(Blueprint)是用于组织代码的一种方式,使应用程序的不同部分可以更容易地被管理和复用。蓝图允许你定义应用程序的模块化组件,并且这些组件可以包含路由、视图函数、模板、静态文件等。通过使用蓝图,可以将大型应用程序拆分为多个小的、功能相关的部分,从而提高代码的可维护性和可读性。
注册蓝图的主要原因是让 Flask 知道蓝图中定义的路由、视图函数和其他处理逻辑。通过注册蓝图,Flask 可以将不同模块的功能组合在一起,并确保请求能够被正确的视图函数处理。
代码位置:dify-0.6.9/api/app.py
def register_blueprints(app):
from controllers.console import bp as console_app_bp # 控制台
from controllers.files import bp as files_bp # 文件
from controllers.inner_api import bp as inner_api_bp # 内部api
from controllers.service_api import bp as service_api_bp # 服务api
from controllers.web import bp as web_bp # web
CORS(service_api_bp,
allow_headers=['Content-Type', 'Authorization', 'X-App-Code'],
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH']
)
app.register_blueprint(service_api_bp) # 注册服务api蓝图
CORS(web_bp,
resources={
r"/*": {"origins": app.config['WEB_API_CORS_ALLOW_ORIGINS']}},
supports_credentials=True,
allow_headers=['Content-Type', 'Authorization', 'X-App-Code'],
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH'],
expose_headers=['X-Version', 'X-Env']
)
app.register_blueprint(web_bp) # 注册web蓝图
CORS(console_app_bp,
resources={
r"/*": {"origins": app.config['CONSOLE_CORS_ALLOW_ORIGINS']}},
supports_credentials=True,
allow_headers=['Content-Type', 'Authorization'],
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH'],
expose_headers=['X-Version', 'X-Env']
)
app.register_blueprint(console_app_bp) # 注册控制台蓝图
CORS(files_bp,
allow_headers=['Content-Type'],
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH']
)
app.register_blueprint(files_bp) # 注册文件蓝图
app.register_blueprint(inner_api_bp) # 注册内部api蓝图
这段代码定义了一个名为 register_blueprints
的函数,用于将多个蓝图注册到 Flask 应用实例中,并配置跨域资源共享(CORS)。CORS 配置允许跨域请求,从而使不同来源的客户端能够访问 API。
def register_blueprints(app):
定义了一个函数 register_blueprints
,接收一个 Flask 应用实例 app
作为参数。
from controllers.console import bp as console_app_bp # 控制台
from controllers.files import bp as files_bp # 文件
from controllers.inner_api import bp as inner_api_bp # 内部api
from controllers.service_api import bp as service_api_bp # 服务api
from controllers.web import bp as web_bp # web
导入了五个蓝图(Blueprint)对象,并分别命名为 console_app_bp
、files_bp
、inner_api_bp
、service_api_bp
和 web_bp
。这些蓝图分别位于 controllers.console
、controllers.files
、controllers.inner_api
、controllers.service_api
和 controllers.web
模块中。
CORS(service_api_bp,
allow_headers=['Content-Type', 'Authorization', 'X-App-Code'],
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH']
)
app.register_blueprint(service_api_bp) # 注册服务api蓝图
为 service_api_bp
蓝图启用 CORS,并配置允许的请求头和方法。然后将 service_api_bp
蓝图注册到 Flask 应用中。
CORS(web_bp,
resources={
r"/*": {"origins": app.config['WEB_API_CORS_ALLOW_ORIGINS']}},
supports_credentials=True,
allow_headers=['Content-Type', 'Authorization', 'X-App-Code'],
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH'],
expose_headers=['X-Version', 'X-Env']
)
app.register_blueprint(web_bp) # 注册web蓝图
为 web_bp
蓝图启用 CORS,并根据应用配置中的 WEB_API_CORS_ALLOW_ORIGINS
设置允许的来源。还配置了支持凭证、允许的请求头和方法,以及暴露的响应头。然后将 web_bp
蓝图注册到 Flask 应用中。
CORS(console_app_bp,
resources={
r"/*": {"origins": app.config['CONSOLE_CORS_ALLOW_ORIGINS']}},
supports_credentials=True,
allow_headers=['Content-Type', 'Authorization'],
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH'],
expose_headers=['X-Version', 'X-Env']
)
app.register_blueprint(console_app_bp) # 注册控制台蓝图
为 console_app_bp
蓝图启用 CORS,并根据应用配置中的 CONSOLE_CORS_ALLOW_ORIGINS
设置允许的来源。还配置了支持凭证、允许的请求头和方法,以及暴露的响应头。然后将 console_app_bp
蓝图注册到 Flask 应用中。
CORS(files_bp,
allow_headers=['Content-Type'],
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH']
)
app.register_blueprint(files_bp) # 注册文件蓝图
为 files_bp
蓝图启用 CORS,并配置允许的请求头和方法。然后将 files_bp
蓝图注册到 Flask 应用中。
app.register_blueprint(inner_api_bp) # 注册内部api蓝图
直接将 inner_api_bp
蓝图注册到 Flask 应用中。
小结:这个函数的主要功能是:导入和定义五个不同模块的蓝图;为每个蓝图启用 CORS(有些蓝图有特殊的 CORS 配置);将这些蓝图注册到 Flask 应用实例中,从而使这些蓝图中的路由和视图函数在应用中生效。
参考文献
[1] https://github.com/langgenius/dify