#python #rest #fastapi #python-typing
#python #rest #fastapi #python-ввод текста
Вопрос:
Я хочу создать общее определение конечной точки в Fast API Python, которое считывает параметр URL path, а затем вызывает определенный метод для выполнения дереализации. Но я всегда получаю
422 Unprocessable Entity
Поэтому я ожидаю, что это работает следующим образом:
/answer/aaa -> handle_generic_answer -> read_item_aaa, введите body в ModelAAA
/answer/bbb -> handle_generic_answer -> read_item_bbb, введите body в ModelBBB и т. Д.
Вот общий код конечной точки:
@app.post("/answer/{type}")
def handle_generic_answer(type: str, item):
# I also tried
# def handle_generic_answer(type: str, item: Any):
# or
# def handle_generic_answer(type: str, item: Optional):
switcher = {
'aaaa': read_item_aaa,
'bbb': read_item_bbb,
'nothing': unrecognised_answer
}
func = switcher.get(type, unrecognised_answer)
print('answer >> ' type)
func(item)
тогда у меня есть отдельные методы, вызываемые на основе type
значения:
def read_item_aaa(item: ModelAAA):
update_aaa(item)
return {"type": "aaa", "result": "success"}
def read_item_bbb(item: ModelBBB):
update_bbb(item)
return {"type": "bbb", "result": "success"}
и значение по умолчанию —
def unrecognised_answer(type):
print("unrecognised_answer")
raise HTTPException(status_code=400, detail="answer type not found")
return {}
модели определяются следующим образом:
from pydantic import BaseModel, Field
class ModelAAA(BaseModel):
field1: str
field2: list = []
Но вызываю ли я
http://localhost:8000/answer/aaa
или http://localhost:8000/answer/some-other-url
Я всегда получаю 422:
{
"detail": [
{
"loc": [
"query",
"item"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
Ответ №1:
Вы забыли аннотировать основной параметр item
.
Без этого item
обрабатывается как str
параметр запроса. Например:
@app.post("/answer/{type}")
def handle_generic_answer(type: str, item: Union[ModelAAA, ModelBBB]):