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.
DjangoBlog/djangoblog/plugin_manage/hooks.py

52 lines
2.0 KiB

This file contains ambiguous Unicode characters!

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.

#gq:
import logging
# 获取当前模块的日志记录器,用于输出钩子系统的日志
logger = logging.getLogger(__name__)
# 私有全局字典,用于存储所有注册的钩子
# 结构:{ "hook_name": [callback1, callback2, ...] }
_hooks = {}
def register(hook_name: str, callback: callable):
"""
注册一个钩子回调。
如果钩子名不存在,则初始化为空列表,再将回调函数追加进去。
"""
if hook_name not in _hooks:
_hooks[hook_name] = []
_hooks[hook_name].append(callback)
logger.debug(f"Registered hook '{hook_name}' with callback '{callback.__name__}'")
def run_action(hook_name: str, *args, **kwargs):
"""
执行一个 Action Hook动作钩子
它会按顺序执行所有注册到该钩子上的回调函数,无返回值。
如果某个回调抛出异常,记录错误日志并继续执行下一个回调。
"""
if hook_name in _hooks:
logger.debug(f"Running action hook '{hook_name}'")
for callback in _hooks[hook_name]:
try:
callback(*args, **kwargs)
except Exception as e:
logger.error(f"Error running action hook '{hook_name}' callback '{callback.__name__}': {e}", exc_info=True)
def apply_filters(hook_name: str, value, *args, **kwargs):
"""
执行一个 Filter Hook过滤钩子
它会将 value 依次传递给所有注册的回调函数进行处理,每次处理结果作为下次输入。
如果某个回调抛出异常,记录错误日志并跳过该回调。
最后返回经过所有过滤器处理后的值。
"""
if hook_name in _hooks:
logger.debug(f"Applying filter hook '{hook_name}'")
for callback in _hooks[hook_name]:
try:
value = callback(value, *args, **kwargs)
except Exception as e:
logger.error(f"Error applying filter hook '{hook_name}' callback '{callback.__name__}': {e}", exc_info=True)
return value