Параметры пути
В этом разделе описаны способы извлечения и валидации 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:
PathParam→strPathParams→dict[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
Rapidy использует встроенные механизмы aiohttp.
Подробнее об объекте aiohttp.Request и методах извлечения данных можно узнать
здесь.