Почему запрос на сервер с использованием модели pydantic получает ошибку (FastAPI)?

Используется фреймворк FastAPI

У меня есть вот такой роут, который использует "интерфейс"
@app.get('/user')
def get_user(req: requests.IGetUser):
    return {}

class IGetUser(BaseModel):
    email: str
    password: str


На фронте прокидывается axios-запрос вот такого типа:
axios.get('http://localhost:8000/user', {
        data: {
            email: 'user',
            password: 'user'
        }
    }).then(r =>
        console.log(r)
    )

В ответ я получаю
422 (Unprocessable Entity)

Но если не использовать pydantic модель в роуте, а просто получать Request:
from starlette.requests import Request

@app.get('/user')
def get_user(req: Request):
    return {}

То все работает. Как можно понять, проблема в модели (но я не могу понять, какая конкретно). С остальными методами (POST, DELETE) все проходит нормально, такое случается только с GET.
  • Вопрос задан
  • 1742 просмотра
Решения вопроса 1
drygdryg
@drygdryg
Python-разработчик
Здесь вы создали маршрут, который принимает GET-запрос с обязательным JSON-телом:
@app.get('/user')
def get_user(req: requests.IGetUser):
    return {}

Но из axios вы отправляете GET-запрос с телом в формате формы (application/x-www-form-urlencoded), а не JSON, поэтому происходит ошибка валидации запроса и возвращается код ответа 422.
Лучше принимайте "email" и "password" в параметрах запроса (query parameters), а не в теле, т.к., в общем, не рекомендуется отправлять GET-запросы с телом: для отправки полезной нагрузки (в формате JSON, формы и пр.) обычно используют другие типы запросов (POST, PUT, PATCH и пр.) Как принимать параметры запросов в FastAPI, описано в официальной документации.
В вашем случае можно сделать так:
@app.get('/user')
def get_user(email: str, password: str):
    return {}

Тогда запрос из axios можно отправлять так:
axios.get('http://localhost:8000/user', {
        params: {
            email: 'user',
            password: 'user'
        }
    }).then(r =>
        console.log(r)
    )
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы