Quart框架json_provider_class不生效,无法转换日期为ISO8601格式
解决Quart中datetime返回ISO8601格式无效的问题
你的代码存在两个关键问题,导致自定义JSONProvider未生效:
1. 错误用静态方法覆盖实例方法
Quart的DefaultJSONProvider中的default方法是实例方法,但你用@staticmethod修饰了自定义的default方法,这会导致Quart序列化时无法正确调用你的自定义逻辑,依然沿用默认的RFC 2822日期格式规则。
2. 未更新已初始化的JSONProvider实例
Quart创建app对象时,会根据默认的json_provider_class生成实例并存储在app.json中。仅修改app.json_provider_class不会替换已存在的实例,默认序列化逻辑仍在运行。
修正后的代码
from datetime import datetime, date from decimal import Decimal from uuid import UUID from dataclasses import is_dataclass, asdict from quart import Quart, DefaultJSONProvider class JSONProvider(DefaultJSONProvider): def default(self, object_): # 移除@staticmethod,改为实例方法 if isinstance(object_, (date, datetime)): return object_.isoformat() if isinstance(object_, (Decimal, UUID)): return str(object_) if is_dataclass(object_): return asdict(object_) if hasattr(object_, "__html__"): return str(object_.__html__()) raise TypeError( f"Object of type {type(object_).__name__} is not JSON serializable") @staticmethod def dict_to_object(dict_): return dict_ def loads(self, object_, **kwargs): return super().loads(object_, object_hook=self.dict_to_object, **kwargs) # 方案一:创建app时直接指定自定义JSONProvider app = Quart('Asaph API', json_provider_class=JSONProvider) # 方案二:先创建app,再手动替换json实例 # app = Quart('Asaph API') # app.json_provider_class = JSONProvider # app.json = JSONProvider(app) # 测试路由 @app.route('/test-date') async def test_date(): return {'current_time': datetime.now()} if __name__ == '__main__': app.run()
验证效果
启动服务后访问/test-date,返回的current_time会以ISO8601格式呈现(如"2024-05-20T15:30:00.123456"),而非原有的RFC 2822格式。
内容的提问来源于stack exchange,提问作者Athus Vieira
相关产品推荐
相关产品推荐

