|
|
"""
|
|
|
JSON 序列化配置
|
|
|
|
|
|
Flask 3.x 使用 JSONProvider 替代 JSONEncoder
|
|
|
支持通过配置文件控制序列化行为
|
|
|
"""
|
|
|
|
|
|
from datetime import datetime, date
|
|
|
from flask.json.provider import DefaultJSONProvider
|
|
|
|
|
|
|
|
|
class CustomJSONProvider(DefaultJSONProvider):
|
|
|
"""
|
|
|
自定义 JSON Provider (Flask 3.x)
|
|
|
|
|
|
功能:
|
|
|
- 处理 datetime 和 date 类型
|
|
|
- 支持配置文件控制序列化参数
|
|
|
"""
|
|
|
|
|
|
def __init__(self, app):
|
|
|
"""
|
|
|
初始化 JSON Provider
|
|
|
|
|
|
从 app.config 读取配置:
|
|
|
- JSON_ENSURE_ASCII: 是否转义非 ASCII 字符
|
|
|
- JSON_SORT_KEYS: 是否对字典 key 排序
|
|
|
- JSON_INDENT: 缩进空格数(None 为不缩进)
|
|
|
- JSON_SEPARATORS: 分隔符元组
|
|
|
"""
|
|
|
super().__init__(app)
|
|
|
|
|
|
# 从配置读取设置
|
|
|
self._ensure_ascii = app.config.get('JSON_ENSURE_ASCII', False)
|
|
|
self._sort_keys = app.config.get('JSON_SORT_KEYS', False)
|
|
|
self._indent = app.config.get('JSON_INDENT', None)
|
|
|
self._separators = app.config.get('JSON_SEPARATORS', (',', ':'))
|
|
|
|
|
|
def default(self, obj):
|
|
|
"""
|
|
|
序列化自定义对象
|
|
|
|
|
|
Args:
|
|
|
obj: 要序列化的对象
|
|
|
|
|
|
Returns:
|
|
|
序列化后的 Python 基本类型
|
|
|
"""
|
|
|
# 处理 datetime 类型
|
|
|
if isinstance(obj, datetime):
|
|
|
return obj.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
|
# 处理 date 类型
|
|
|
elif isinstance(obj, date):
|
|
|
return obj.strftime("%Y-%m-%d")
|
|
|
|
|
|
# 其他类型调用父类处理
|
|
|
return super().default(obj)
|
|
|
|
|
|
def dumps(self, obj, **kwargs):
|
|
|
"""
|
|
|
序列化为 JSON 字符串
|
|
|
|
|
|
合并配置文件和运行时参数
|
|
|
"""
|
|
|
# 使用配置文件的默认值
|
|
|
kwargs.setdefault('ensure_ascii', self._ensure_ascii)
|
|
|
kwargs.setdefault('sort_keys', self._sort_keys)
|
|
|
|
|
|
if self._indent is not None:
|
|
|
kwargs.setdefault('indent', self._indent)
|
|
|
|
|
|
kwargs.setdefault('separators', self._separators)
|
|
|
|
|
|
return super().dumps(obj, **kwargs)
|
|
|
|
|
|
|
|
|
def init_encoder(app):
|
|
|
"""
|
|
|
初始化 JSON 编码器
|
|
|
|
|
|
配置:
|
|
|
- 设置自定义 JSONProvider
|
|
|
- 从配置文件读取序列化参数
|
|
|
- 支持环境差异化配置
|
|
|
"""
|
|
|
# 设置自定义 Provider
|
|
|
app.json_provider_class = CustomJSONProvider
|
|
|
|
|
|
# 直接设置 app.json 的属性(Flask 3.x 推荐方式)
|
|
|
app.json.ensure_ascii = app.config.get('JSON_ENSURE_ASCII', False)
|
|
|
app.json.sort_keys = app.config.get('JSON_SORT_KEYS', False)
|