覆盖FastAPI中JSU编码器的默认编码器

2024-06-14 08:41:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Fast API编写了如下代码:

class EnumTestT(Enum):
    test_t_value = 0

object = { 
    test: test_t_value
}

enum_mapping = {
    test_t_value: "Test"
}

def enum_encoder(val: EnumTestT) -> str:
    return enum_mapping[val]

custom_encoder = {
    EnumTestT: enum_encoder
}

@app.get("/test")
async def test_get():
    return jsonable_encoder(object, custom_encoder=custom_encoder)

问题是jsonable_encoder在默认值之后应用自定义编码器。有没有办法在默认编码器之前应用它们。因为对于Enum和任何派生类,将报告枚举的值而不是映射的值


Tags: testencodergetreturnobjectvaluedefcustom
2条回答

现在我在json.dumps中使用自定义编码器,如下所示:

class TestEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, EnumTestT):
            return TestEncoder.process_enum_test_t(obj)

FastAPI应用程序中的响应是:

json_str = json.dumps(json_list, cls=TestEncoder).encode('utf-8')
return Response(media_type="application/json", content=json_str)

使用自定义编码器的FastAPI的问题在于,在调用了所有标准编码器之后调用了自定义编码器,并且无法覆盖该顺序

FastAPI使用编码器按类型(来自pydantic.json)对一些基本数据类型进行编码

ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = {
    bytes: lambda o: o.decode(),
    Color: str,
    datetime.date: isoformat,
    datetime.datetime: isoformat,
    datetime.time: isoformat,
    datetime.timedelta: lambda td: td.total_seconds(),
    Decimal: decimal_encoder,
    Enum: lambda o: o.value,

所以我要覆盖默认的日期时间编码,就像

 ENCODERS_BY_TYPE[datetime] = lambda date_obj: date_obj.strftime("%Y-%m-%d %H:%M:%S")

相关问题 更多 >