跳转至

Hook 系统

Hook 系统允许在 CRUD 操作的关键点插入自定义逻辑。


支持的 Hook 事件

FastAPI-Easy 支持 10 种 Hook 事件:

  • before_get_all - 获取所有记录前
  • after_get_all - 获取所有记录后
  • before_get_one - 获取单个记录前
  • after_get_one - 获取单个记录后
  • before_create - 创建记录前
  • after_create - 创建记录后
  • before_update - 更新记录前
  • after_update - 更新记录后
  • before_delete - 删除记录前
  • after_delete - 删除记录后

基础使用

注册 Hook

from fastapi_easy.core import migration_hook

@migration_hook("before_create")
async def validate_before_create(data):
    # 验证数据
    if not data.get("name"):
        raise ValueError("Name is required")
    return data

使用 Hook 注册表

from fastapi_easy.core import HookRegistry

registry = HookRegistry()

async def log_after_create(data):
    print(f"Created: {data}")

registry.register("after_create", log_after_create)

Hook 优先级

Hook 支持优先级控制,优先级高的 Hook 先执行:

@migration_hook("before_create", priority=10)
async def high_priority_hook(data):
    pass

@migration_hook("before_create", priority=5)
async def low_priority_hook(data):
    pass

异步和同步 Hook

支持异步和同步 Hook:

# 异步 Hook
@migration_hook("before_create")
async def async_hook(data):
    await some_async_operation()
    return data

# 同步 Hook
@migration_hook("before_create")
def sync_hook(data):
    some_sync_operation()
    return data

错误处理

Hook 中的错误会被隔离,不会影响其他 Hook:

@migration_hook("after_create")
async def hook_with_error(data):
    try:
        await risky_operation()
    except Exception as e:
        logger.error(f"Hook error: {e}")
        # 错误被捕获,不会中断其他 Hook

实际应用

1. 数据验证

@migration_hook("before_create")
async def validate_email(data):
    if not is_valid_email(data.get("email")):
        raise ValueError("Invalid email")
    return data

2. 数据转换

@migration_hook("before_create")
async def normalize_data(data):
    data["name"] = data["name"].strip().lower()
    return data

3. 审计日志

@migration_hook("after_create")
async def log_creation(data):
    await audit_log.create(
        action="create",
        resource="Item",
        resource_id=data["id"]
    )

4. 缓存更新

@migration_hook("after_update")
async def update_cache(data):
    await cache.set(f"item:{data['id']}", data)

5. 外部系统集成

@migration_hook("after_create")
async def send_notification(data):
    await notification_service.send(
        f"New item created: {data['name']}"
    )

Hook 上下文

Hook 可以访问上下文信息:

from fastapi_easy.core import HookContext

@migration_hook("before_create")
async def hook_with_context(data, context: HookContext):
    # 访问当前用户
    user = context.current_user
    # 访问请求对象
    request = context.request
    # 访问其他上下文信息
    return data

最佳实践

1. 保持 Hook 轻量

# 不好:在 Hook 中进行重操作
@migration_hook("after_create")
async def heavy_hook(data):
    for i in range(1000000):
        await some_operation()

# 好:使用后台任务
@migration_hook("after_create")
async def light_hook(data):
    background_tasks.add_task(heavy_operation, data)

2. 错误处理

@migration_hook("before_create")
async def safe_hook(data):
    try:
        return await validate(data)
    except ValidationError as e:
        raise ValueError(f"Validation failed: {e}")

3. 日志记录

@migration_hook("after_create")
async def logged_hook(data):
    logger.info(f"Item created: {data['id']}")
    return data

常见问题

Q: Hook 的执行顺序是什么?

A: 按优先级从高到低执行,优先级相同时按注册顺序执行。

Q: Hook 中的异常会怎样?

A: 异常会被捕获并记录,不会中断其他 Hook 的执行。

Q: 如何禁用某个 Hook?

A: 使用 registry.unregister(event, callback) 方法。