You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:57:19