优化代码风格

This commit is contained in:
ZZX9599
2025-09-15 19:45:11 +08:00
parent cac28e990e
commit b280cc6f99

View File

@ -1,32 +1,42 @@
import datetime
import json
from functools import wraps
from typing import Any
from encryption.encryption import aes_encrypt
from schema.response_schema import APIResponse
# 假设SensitiveResponse等是Pydantic模型需导入BaseModel
from pydantic import BaseModel
def encrypt_response(field: str = "data"):
"""接口返回值加密装饰器:默认加密APIResponse的data字段"""
"""接口返回值加密装饰器:正确序列化自定义对象为JSON"""
def decorator(func):
@wraps(func) # 保留原函数元信息避免FastAPI路由异常
@wraps(func)
async def wrapper(*args, **kwargs):
# 执行原接口函数获取原始响应APIResponse对象
original_response: APIResponse = await func(*args, **kwargs)
field_value = getattr(original_response, field)
# 若需加密的字段为空直接返回原响应如注册接口data=None
if not getattr(original_response, field):
if not field_value:
return original_response
# 复杂数据转JSON字符串支持datetime、字典、列表等
field_value = getattr(original_response, field)
field_value_json = json.dumps(field_value, default=str) # 处理特殊类型
# 自定义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) # 作为最后兜底
# AES加密并替换原字段
# 使用自定义序列化函数确保生成标准JSON
field_value_json = json.dumps(field_value, default=json_default)
encrypted_data = aes_encrypt(field_value_json)
setattr(original_response, field, encrypted_data)
# 返回加密后的响应
return original_response
return wrapper