Files
video/encryption/encrypt_decorator.py

44 lines
1.6 KiB
Python
Raw Normal View History

2025-09-15 19:45:11 +08:00
import datetime
2025-09-15 18:24:33 +08:00
import json
2025-09-15 18:08:54 +08:00
from functools import wraps
2025-09-15 19:45:11 +08:00
from typing import Any
2025-09-15 18:35:43 +08:00
from encryption.encryption import aes_encrypt
2025-09-15 18:08:54 +08:00
from schema.response_schema import APIResponse
2025-09-15 19:45:11 +08:00
# 假设SensitiveResponse等是Pydantic模型需导入BaseModel
from pydantic import BaseModel
2025-09-15 18:24:33 +08:00
def encrypt_response(field: str = "data"):
2025-09-15 19:45:11 +08:00
"""接口返回值加密装饰器正确序列化自定义对象为JSON"""
2025-09-15 18:24:33 +08:00
def decorator(func):
2025-09-15 19:45:11 +08:00
@wraps(func)
2025-09-15 18:24:33 +08:00
async def wrapper(*args, **kwargs):
original_response: APIResponse = await func(*args, **kwargs)
2025-09-15 19:45:11 +08:00
field_value = getattr(original_response, field)
2025-09-15 18:24:33 +08:00
2025-09-15 19:45:11 +08:00
if not field_value:
2025-09-15 18:24:33 +08:00
return original_response
2025-09-15 19:45:11 +08:00
# 自定义JSON序列化函数处理Pydantic模型和datetime
def json_default(obj: Any) -> Any:
# 处理Pydantic模型转换为字典
if isinstance(obj, BaseModel):
return obj.model_dump() # Pydantic v2用model_dump()v1用dict()
# 处理datetime转换为ISO格式字符串
if isinstance(obj, datetime):
return obj.isoformat()
# 其他无法序列化的类型,可根据需要扩展
return str(obj) # 作为最后兜底
# 使用自定义序列化函数确保生成标准JSON
field_value_json = json.dumps(field_value, default=json_default)
2025-09-15 18:24:33 +08:00
encrypted_data = aes_encrypt(field_value_json)
setattr(original_response, field, encrypted_data)
return original_response
return wrapper
return decorator