- Имеется интерфейс веб-сервера FastAPI, который содержит некоторую базовую логику
- Существует класс, который содержит всю основную логику, назовем его KeyValueStore для этого примера.
Скажем, основная логика так же проста, как структура данных, в которой хранятся пары ключ-значение:
Код: Выделить всё
class KeyValueStore():
def __init__(self):
self.data = {}
def put(self, key, value):
if key in self.data:
raise RuntimeError(f'duplicate key {key}')
self.data[key] = value
def get(self, key):
# doesn't really matter what the implementation is
Это фиксируется на уровне FastAPI. Код выглядит примерно так:
Код: Выделить всё
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from fastapi import status
from pydantic import BaseModel
class FastAPI_KeyValuePair(BaseModel):
key: str
value: str
class FastAPI_ReturnStatus(BaseModel):
status: str
message: str|None = None
@app.post('/put_key_value')
def put_key_value(key_value_pair: FastAPI_KeyValuePair):
try:
key_value_store.put(
key_value_pair.key,
key_value_pair.value,
)
return FastAPI_ReturnStatus(status='success', message=None)
except RuntimeError as error:
return JSONResponse(
status_code=status.HTTP_409_CONFLICT,
content=FastAPI_ReturnStatus(
status='error',
message=str(error),
)
)
Обычный оператор возврата выглядит примерно так:
Код: Выделить всё
return FastAPI_ReturnStatus(status='success', message=None)
Я хотел установить для этого кода состояния что-нибудь другое, например 409. Я не смог найти способа сделать это, кроме как с помощью JSONResponse:
Код: Выделить всё
return JSONResponse(
status_code=status.HTTP_409_CONFLICT,
content=FastAPI_ReturnStatus(
status='error',
message=str(error),
)
)
Что на самом деле происходит с этим кодом, так это то, что я получаю исключение:
Код: Выделить всё
TypeError: Object of type FastAPI_ReturnStatus is not JSON serializable
Код: Выделить всё
return FastAPI_ReturnStatus(status='success', message=None)
Почему FastAPI_ReturnStatus не сериализуется в этом контексте, но сериализуется, если тип возвращаемого значения — FastAPI_ReturnStatus (не вложен в какой-либо другой объект)?
Подробнее здесь: https://stackoverflow.com/questions/787 ... n-when-ret
Мобильная версия