| 
									
										
										
										
											2025-09-15 18:24:33 +08:00
										 |  |  |  | import json | 
					
						
							| 
									
										
										
										
											2025-09-15 19:47:26 +08:00
										 |  |  |  | from datetime import datetime | 
					
						
							| 
									
										
										
										
											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
										 |  |  |  | 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 |