Параметры пути
В этом разделе описаны способы извлечения и валидации 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
→str
PathParams
→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
и методах извлечения данных можно узнать
здесь.