import importlib from flask import Blueprint import os import json plugin_bp = Blueprint("plugin", __name__, url_prefix="/plugin") PLUGIN_ENABLE_FOLDERS = [] PLUGIN_IMPORTLIB = [] def init_plugin(app) -> None: """ 初始化运行时插件。 插件是部署时可选扩展,不是业务项目主模块。业务主模块应通过 create_app(modules=[...]) 显式注册。 """ global PLUGIN_ENABLE_FOLDERS app.register_blueprint(plugin_bp) # 载入插件 PLUGIN_ENABLE_FOLDERS 是插件文件夹名 PLUGIN_ENABLE_FOLDERS = app.config.get("PLUGIN_ENABLE_FOLDERS", []) for folder in PLUGIN_ENABLE_FOLDERS: plugin_info = { "plugin_name": folder, } try: if os.path.exists("plugins/" + folder + "/__init__.json"): with open( "plugins/" + folder + "/__init__.json", "r", encoding="utf-8" ) as f: plugin_info = json.loads(f.read()) # 将插件全部载入 PLUGIN_IMPORTLIB.append(importlib.import_module("plugins." + folder)) print(f" * Plugin: Loaded plugin: {plugin_info['plugin_name']} ...") except BaseException as e: info = ( f" * Plugin: Crash a error when loading {plugin_info['plugin_name'] if len(plugin_info) != 0 else 'plugin'} :" + "\n" ) app.logger.error(info) app.logger.exception(e) def broadcast_execute(app, function_name): for plugin in PLUGIN_IMPORTLIB: try: # 初始化完成事件 try: getattr(plugin, function_name)(app) except AttributeError: # 没有插件启用事件就不调用 pass except BaseException as e: app.logger.exception(e) if function_name == "event_finish": with app.app_context(): broadcast_execute(app, "event_context")