Числовая валидация параметра пути в FastAPI
Использование с параметрами запросаQueryСпособ добавления валидации тот же; можно использоватьPathОбъявите числовую валидацию и метаданные для параметров пути.
Импорт Path
fromfastapiИмпортPath, fromtypingИмпортAnnotated:
Пример
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
# Добавить метаданные и валидацию для параметров пути
item_id: Annotated[int, Path(title="ID продукта", description="ID продукта для получения", ge=1)],
):
return {"item_id": item_id}
Параметры пути всегда обязательны, так как они должны быть частью URL-пути. Даже если вы объявите для них значение по умолчанию, они всё равно считаются обязательными параметрами.
Валидация чисел
PathиQueryВсе поддерживают следующие параметры числовой валидации:
| Параметр | Значение | Источник на английском |
|---|---|---|
gt | знак больше | gольше tем |
ge | больше или равно | gольше или eавно |
lt | знак меньше | lеньше tем |
le | меньше или равно | lеньше или eавно |
Больше или равно (ge)
Пределitem_idДолжно быть >= 1:
Пример
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
item_id: Annotated[int, Path(ge=1)], # item_id должен быть >= 1
):
return {"item_id": item_id}
Комбинирование числовой валидации
Пример
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
# item_id должен быть > 0 и <= 1000
item_id: Annotated[int, Path(gt=0, le=1000)],
# Параметры запроса также могут использовать числовую валидацию
size: Annotated[float, Query(gt=0, lt=10.5)] = 5.0,
):
return {"item_id": item_id, "size": size}
Валидация чисел с плавающей запятой
Числовая валидация также применяется к числам с плавающей запятой.gt(больше чем) иgeРазница (больше или равно) важна в сценариях с плавающей точкой:
Пример
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
item_id: Annotated[int, Path(ge=1, le=1000)],
# size должен быть > 0 и < 10.5
# 0.5 — допустимое значение, 0.0 и 0 — нет (потому что gt=0 строго больше 0)
size: Annotated[float, Query(gt=0, lt=10.5)],
):
return {"item_id": item_id, "size": size}
Смешивание параметров пути и параметров запроса
Когда вы используете обаPathиQueryпри использованииAnnotatedЭто может помочь избежать проблем с порядком параметров:
Пример
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
# После использования Annotated порядок параметров не важен
item_id: Annotated[int, Path(title="ID продукта", ge=1, le=1000)],
q: Annotated[str | None, Query(max_length=50)] = None,
):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
Итог
Ключевые моменты числовой валидации для параметров пути:
- Использование
Annotated+PathОбъявление правил валидации для параметров пути - Числовая валидация:
gt(больше),ge(больше или равно),lt(меньше),le(меньше или равно) PathиQueryИспользование одних и тех же параметров валидации, включая валидацию строк (min_lengthи т. д.) и метаданные (title、descriptionи т.д.)- Параметры пути всегда обязательны, независимо от того, объявлено ли значение по умолчанию.