Перейти к содержанию

Параметры пути

В этом разделе описаны способы извлечения и валидации path-параметров в Rapidy.

Вы можете проверять данные, используя любой тип, поддерживаемый pydantic.

Описание

Path-параметры позволяют создавать динамические маршруты в вашем приложении.

Вы можете определить path-параметры, используя синтаксис форматированных строк Python:

from rapidy.http import get, PathParam

@get('/{user_id}')
async def handler(
    user_id: str = PathParam(),
) -> ...:

Подробнее о динамических маршрутах в aiohttp можно прочитать здесь.

Извлечение одиночного параметра пути

PathParam позволяет извлечь одиночный path-параметр.

from rapidy.http import get, PathParam

@get('/{user_id}')
async def handler(
    user_id: str = PathParam(),
) -> ...:
from rapidy.http import get, PathParam

@get('/{user_id}/{user_data}')
async def handler(
    user_id: str = PathParam(),
    user_data: str = PathParam(),
) -> ...:

Извлечение всех параметров пути

PathParams позволяет извлечь сразу все path-параметры.

Извлечение в заранее заданную схему

pydantic.BaseModel

from pydantic import BaseModel
from rapidy.http import get, PathParams

class PathData(BaseModel):
    user_id: str
    user_data: str

@get('/{user_id}/{user_data}')
async def handler(
    path_data: PathData = PathParams(),
) -> ...:

dataclasses.dataclass

dataclasses.dataclass поддерживаются в качестве модели, но задать alias стандартными средствами dataclasses невозможно.

from dataclasses import dataclass
from rapidy.http import get, PathParams

@dataclass
class PathData:
    user_id: str
    user_data: str

@get('/{user_id}/{user_data}')
async def handler(
    path_data: PathData = PathParams(),
) -> ...:

Извлечение в словарь

from rapidy.http import get, PathParams

@get('/{user_id}/{user_data}')
async def handler(
    path_data: dict[str, str] = PathParams(),
) -> ...:
# {'user_id': ..., 'user_data': ...}

Извлечение без валидации

Отключение валидации не рекомендуется.

Если валидация отключена, параметры возвращаются в базовой структуре aiohttp:

  • PathParamstr
  • PathParamsdict[str, str]

Способы отключения валидации

Явное отключение

from rapidy.http import get, PathParam, PathParams

@get('/')
async def handler_1(
    user_id: int = PathParam(validate=False)
) -> ...:
    # ...

@get('/')
async def handler_2(
    path_data: int = PathParams(validate=False)
) -> ...:
    # {'user_id': ..., 'user_data': ...}

Использование Any

from typing import Any

@get('/')
async def handler_1(
    user_id: Any = PathParam()
) -> ...:
    # "0.0.0.0:8080"

@get('/')
async def handler_2(
    path_data: Any = PathParams()
) -> ...:
    # {'user_id': ..., 'user_data': ...}

Отсутствие аннотации типа

Если тип не указан, по умолчанию используется Any.

@get('/')
async def handler_1(
    user_id=PathParam()
) -> ...:
    # ...

@get('/')
async def handler_2(
    path_data=PathParams()
) -> ...:
    # {'user_id': ..., 'user_data': ...}

Значения по умолчанию

PathParam и PathParams не поддерживают значения по умолчанию.

Это осознанное архитектурное ограничение: без него невозможно корректно реализовать динамическую маршрутизацию.

Попытка установить default или default_factory для path-параметра приведёт к исключению ParameterCannotUseDefaultError или ParameterCannotUseDefaultFactoryError.

Предупреждения и особенности

Одновременное использование PathParam и PathParams

Нельзя использовать PathParam и PathParams одновременно в одном обработчике.

@get('/{user_id}/{user_data}')
async def handler(
    user_id: str = PathParam(),
    path_data: PathData = PathParams(),
) -> ...:

При запуске приложения будет вызвано исключение AnotherDataExtractionTypeAlreadyExistsError:

------------------------------
Attribute with this data extraction type cannot be added to the handler - another data extraction type is already used in the handler.

Handler path: `main.py`
Handler name: `handler`
Attribute name: `path_data`
------------------------------

Атрибут alias для PathParams

Атрибут alias не работает в параметре PathParams().

@get('/{user_id}/{user_data}')
async def handler(
    path_data: PathData = PathParams(alias='SomeName'),  # <-- alias not working
) -> ...:

Извлечение сырых данных

В Rapidy используется метод match_info объекта Request, после чего полученные данные передаются в pydantic для валидации.

Как происходит извлечение внутри Rapidy

async def extract_path(request: Request) -> dict[str, str]:
    return dict(request.match_info)

Rapidy использует встроенные механизмы aiohttp.

Подробнее об объекте aiohttp.Request и методах извлечения данных можно узнать здесь.