Статус HTTP_422_UNPROCESSABLE_ENTITY
Статус HTTP_422_UNPROCESSABLE_ENTITY - это константа из модуля
fastapi.status, равная числу 422. Она означает,
что сервер принял запрос, понял его тип, но не может обработать
содержащиеся в нём данные. В FastAPI этот статус возвращается
автоматически, когда входящие данные не проходят валидацию
Pydantic-модели: отсутствует обязательное поле, неверный тип,
нарушено ограничение и т.п. Константу можно использовать
в параметре status_code декораторов маршрутов и в объекте
HTTPException.
Синтаксис
from fastapi import status
status.HTTP_422_UNPROCESSABLE_ENTITY
Пример
Давайте посмотрим, как FastAPI автоматически возвращает статус
422, когда тело запроса не проходит валидацию модели:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
name: str
age: int
@app.post('/user/')
def create_user(user: User):
return {'name': user.name, 'age': user.age}
Если отправить POST-запрос с телом, где поле age
является строкой вместо числа, FastAPI вернёт статус 422
и JSON с описанием ошибки:
{
"detail": [
{
"type": "int_parsing",
"loc": ["body", "age"],
"msg": "Input should be a valid integer, unable to parse string as an integer",
"input": "abcde"
}
]
}
Пример
Давайте явно вернём статус HTTP_422_UNPROCESSABLE_ENTITY
через исключение HTTPException, когда данные формально
прошли валидацию, но не устраивают бизнес-логику:
from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel
app = FastAPI()
class Article(BaseModel):
title: str
content: str
@app.post('/article/')
def create_article(article: Article):
if len(article.title) < 3:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail='title is too short'
)
return {'title': article.title, 'content': article.content}
Результат выполнения кода для тела запроса
с title равным 'ab':
{"detail": "title is too short"}
Пример
Давайте укажем статус HTTP_422_UNPROCESSABLE_ENTITY
в параметре status_code декоратора маршрута:
Такой подход используется редко, поскольку статус 422
обычно означает именно ошибку валидации, а не успешную обработку.
Тем не менее, при необходимости его можно задать вручную.
Смотрите также
-
статус
HTTP_400_BAD_REQUEST,
который означает некорректный запрос клиента -
статус
HTTP_409_CONFLICT,
который означает конфликт с текущим состоянием ресурса -
статус
HTTP_429_TOO_MANY_REQUESTS,
который означает превышение лимита запросов -
модуль
status,
который содержит все константы HTTP-статусов