Порядок параметров
Допустим, вы хотите объявить age как обязательный параметр запроса типа str к прошлому коду. Но нам по-прежнему нужно использовать Path для параметра пути username.
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/user/{username}")
async def login(username: str = Path(min_length=3, max_length=15, description='Enter your username', example='Ilya'),
age: int) -> dict:
return {"user": username, "age": age}
Если вы поместите параметр запроса без значения по умолчанию после параметра пути, у которого нет значения по умолчанию, то Python укажет на ошибку.
Также при запуске сервера мы получим ошибку - SyntaxError: parameter without a default follows parameter with a default
Но вы можете изменить порядок параметров, чтобы параметр без значения по умолчанию (параметр запроса age) шёл первым.
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/user/{username}")
async def login(age: int, username: str = Path(min_length=3, max_length=15, description='Enter your username',
example='Ilya')) -> dict:
return {"user": username, "age": age}
Это не имеет значения для FastAPI. Он распознает параметры по их названиям, типам и значениям, ему не важен их порядок. Но данный код выглядит не совсем логично, поэтому мы можем использовать класс Annotated. И теперь мы больше не столкнемся с этой проблемой. Поддержка Annotated была добавлена в FastAPI начиная с версии 0.95.0 (и именно с этой версии рекомендуется использовать этот подход).
from typing import Annotated
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/user/{username}")
async def login(
username: Annotated[str, Path(min_length=3, max_length=15, description='Enter your username', example='Ilya')],
age: int) -> dict:
return {"user": username, "age": age}
И в заключении хотелось бы добавить, что Path-параметр всегда является обязательным, поскольку он составляет часть пути. Тем не менее даже если вы объявите его как None или установите для него значение по умолчанию, это ни на что не повлияет и параметр пути все равно останется обязательным.
Ссылка на документацию - https://fastapi.tiangolo.com/ru/tutorial/path-params-numeric-validations/