2.5 Валидация параметров маршрутов (Path, Query)
9 из 9 шагов пройдено
12 из 12 баллов  получено

Порядок параметров

Допустим, вы хотите объявить 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/


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.