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

85 lines
3.7 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.

import logging
# wr创建当前模块的日志记录器用于记录钩子系统的运行日志如注册、执行、错误等
logger = logging.getLogger(__name__)
# wr私有字典用于存储所有注册的钩子
# wr键为钩子名称str值为该钩子对应的回调函数列表list[callable]
_hooks = {}
def register(hook_name: str, callback: callable):
"""
wr注册一个回调函数到指定钩子。
一个钩子可以注册多个回调函数,执行时会按注册顺序依次调用。
Args:
hook_name: 钩子名称(需与后续执行/过滤时的钩子名称对应)
callback: 回调函数(当钩子触发时需要执行的函数)
"""
#wr 如果钩子名称不在_hooks中先初始化一个空列表用于存储回调
if hook_name not in _hooks:
_hooks[hook_name] = []
#wr 将回调函数添加到该钩子的回调列表中
_hooks[hook_name].append(callback)
#wr 记录调试日志,说明已注册钩子及对应的回调函数名
logger.debug(f"Registered hook '{hook_name}' with callback '{callback.__name__}'")
def run_action(hook_name: str, *args, **kwargs):
"""
wr执行指定的"动作钩子Action Hook"
动作钩子用于触发一系列操作(无返回值),会按注册顺序执行所有绑定的回调函数。
Args:
hook_name: 要执行的钩子名称
*args: 传递给回调函数的位置参数
**kwargs: 传递给回调函数的关键字参数
"""
# wr检查该钩子是否有已注册的回调函数
if hook_name in _hooks:
logger.debug(f"Running action hook '{hook_name}'")
# wr遍历该钩子的所有回调函数并执行
for callback in _hooks[hook_name]:
try:
#wr 传递参数调用回调函数
callback(*args, **kwargs)
except Exception as e:
# wr捕获回调执行中的异常记录错误日志包含异常详情
logger.error(
f"Error running action hook '{hook_name}' callback '{callback.__name__}': {e}",
exc_info=True #wr 记录完整的异常堆栈信息
)
def apply_filters(hook_name: str, value, *args, **kwargs):
"""
wr执行指定的"过滤钩子Filter Hook"
过滤钩子用于对一个值进行链式处理(有输入有输出),会将初始值依次传递给所有绑定的回调函数,
每个回调的返回值作为下一个回调的输入,最终返回经过所有处理后的结果。
Args:
hook_name: 要执行的钩子名称
value: 初始值(需要被过滤/处理的值)
*args: 传递给回调函数的位置参数
**kwargs: 传递给回调函数的关键字参数
Returns:
经过所有回调函数处理后的最终值
"""
#wr 检查该钩子是否有已注册的回调函数
if hook_name in _hooks:
logger.debug(f"Applying filter hook '{hook_name}'")
# wr遍历该钩子的所有回调函数对值进行链式处理
for callback in _hooks[hook_name]:
try:
# wr调用回调函数处理当前值将返回值作为新值继续处理
value = callback(value, *args, **kwargs)
except Exception as e:
#wr 捕获回调执行中的异常,记录错误日志(包含异常详情)
logger.error(
f"Error applying filter hook '{hook_name}' callback '{callback.__name__}': {e}",
exc_info=True #wr 记录完整的异常堆栈信息
)
#wr 返回最终处理后的值(若没有回调,直接返回初始值)
return value