Как читать параметры URL и ввод текста в быстром API Python

#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]):