You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
import os
import logging
from django . conf import settings
# 获取当前模块的日志记录器,用于输出插件加载过程中的日志信息(如成功或失败记录)
logger = logging . getLogger ( __name__ )
def load_plugins ( ) :
"""
动态加载并初始化插件。
功能说明:
该函数用于在 Django 项目启动时,自动发现并加载配置在 `settings.ACTIVE_PLUGINS` 中的插件。
它会检查每个插件是否存在于指定的插件目录中,并确认其包含入口文件 `plugin.py`。
如果条件满足,则导入该插件模块,从而执行其内部的初始化代码(如注册信号、钩子、视图、中间件等)。
调用时机:
通常在 Django 的 `AppConfig.ready()` 方法中调用此函数,以确保 Django 的应用注册系统已完全就绪,
避免因过早导入而导致的依赖问题或模型未加载异常。
执行逻辑:
1. 遍历 settings 中定义的活跃插件列表( ACTIVE_PLUGINS) 。
2. 对每个插件,构造其在文件系统中的路径。
3. 判断该路径是否为一个目录,且包含名为 ' plugin.py ' 的文件(插件入口)。
4. 若满足条件,则使用 __import__ 动态导入该模块。
5. 成功导入后记录一条 info 级别的日志;若导入失败,则捕获 ImportError 异常并记录错误日志。
注意事项:
- 此函数不返回任何值,也不对插件进行实例化,仅通过导入模块来触发其副作用(如注册行为)。
- 插件必须遵循目录结构规范:`plugins/<插件名>/plugin.py`。
- 错误日志中包含异常堆栈( exc_info=True) , 便于调试和排查插件加载失败原因。
"""
# 遍历 settings 中配置的已激活插件名称列表
for plugin_name in settings . ACTIVE_PLUGINS :
# 构建当前插件的完整文件路径
plugin_path = os . path . join ( settings . PLUGINS_DIR , plugin_name )
# 检查该插件路径是否为有效目录,且包含 plugin.py 入口文件
if os . path . isdir ( plugin_path ) and os . path . exists ( os . path . join ( plugin_path , ' plugin.py ' ) ) :
try :
# 动态导入插件模块,触发其初始化逻辑
__import__ ( f ' plugins. { plugin_name } .plugin ' )
# 记录插件加载成功的日志
logger . info ( f " Successfully loaded plugin: { plugin_name } " )
except ImportError as e :
# 记录插件加载失败的错误日志,并包含完整的异常堆栈信息
logger . error ( f " Failed to import plugin: { plugin_name } " , exc_info = e )