Параметр strict
Параметр strict применяется в моделях Pydantic, которые используются в FastAPI для валидации данных запроса и ответа.
Он включает строгий режим проверки: значения не приводятся к нужному типу автоматически, а принимаются только те, что изначально соответствуют аннотации.
Параметр можно задать в Field, в ConfigDict модели или в методе model_validate.
Синтаксис
Field(strict=True)
model_config = ConfigDict(strict=True)
Model.model_validate(data, strict=True)
Пример
Давайте создадим модель без строгого режима и посмотрим, как Pydantic приводит строку к числу:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
age: int
@app.post('/user')
def create_user(user: User):
return {'age': user.age}
Отправим на адрес /user тело запроса с числом в виде строки:
{"age": "25"}
Результат выполнения кода:
{"age": 25}
Как видим, строка "25" была автоматически приведена к числу 25.
Пример
Давайте включим строгий режим через Field и повторим запрос:
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class User(BaseModel):
age: int = Field(strict=True)
@app.post('/user')
def create_user(user: User):
return {'age': user.age}
Отправим на адрес /user тело запроса с числом в виде строки:
{"age": "25"}
Результат выполнения кода:
{"detail": [{"type": "int_type", "loc": ["body", "age"], "msg": "Input should be a valid integer", "input": "25"}]}
Теперь FastAPI вернул ошибку 422, потому что строка не является числом.
Пример
Давайте включим строгий режим сразу для всей модели через ConfigDict:
from fastapi import FastAPI
from pydantic import BaseModel, ConfigDict
app = FastAPI()
class User(BaseModel):
model_config = ConfigDict(strict=True)
age: int
name: str
@app.post('/user')
def create_user(user: User):
return user
Отправим на адрес /user корректное тело запроса:
{"age": 25, "name": "abcde"}
Результат выполнения кода:
{"age": 25, "name": "abcde"}
Если же передать возраст строкой, валидация снова завершится ошибкой.
Пример
Давайте включим строгий режим только на время вызова метода model_validate:
from pydantic import BaseModel
class User(BaseModel):
age: int
name: str
res = User.model_validate({'age': 25, 'name': 'abcde'}, strict=True)
print(res)
Результат выполнения кода:
age=25 name='abcde'
Смотрите также
-
параметр
populate_by_name,
который разрешает заполнение полей по имени атрибута -
параметр
frozen,
который делает экземпляры модели неизменяемыми -
метод
model_validate,
который валидирует данные и создаёт экземпляр модели -
класс
ConfigDict,
который задаёт настройки модели, включая strict