Параметры запроса
Данный раздел покажет, как можно извлекать и проверять query-params используя Rapidy.
Вы можете проверить данные, используя любой тип, поддерживаемый pydantic.
Описание
Query-параметры представляют собой набор пар ключ-значение, которые идут после знака ? в URL-адресе, разделенные символами &.
Пример URL со строкой запроса, включающей три параметра.
https://www.rapidy.com/search?query=database+tools&star_rating=4&order=alphabetical
QueryParam
QueryParam извлекает одиночный query-параметр по его имени.
from rapidy.http import get, QueryParam
@get('/')
async def handler(
query: str = QueryParam(),
) -> ...:
from rapidy.http import get, QueryParam
@get('/')
async def handler(
query: str = QueryParam(),
star_rating: str = QueryParam(),
) -> ...:
QueryParams
QueryParams извлекает сразу все query-параметры.
Помните, вы можете проверить данные используя любой тип поддерживаемый pydantic.
Извлечение в готовую схему
pydantic.BaseModel
from pydantic import BaseModel
from rapidy.http import get, QueryParams
class QueryParamsData(BaseModel):
query: str
star_rating: str
@get('/')
async def handler(
query_params_data: QueryParamsData = QueryParams(),
) -> ...:
dataclasses.dataclass
dataclasses.dataclass поддерживаются в качестве типа модели, но у вас не получится
задать alias используя стандартные инструменты dataclasses.dataclass.
from dataclasses import dataclass
from rapidy.http import get, QueryParams
@dataclass
class QueryParamsData:
query: str
star_rating: str
@get('/')
async def handler(
query_params_data: QueryParamsData = QueryParams(),
) -> ...:
Извлечение в словарь
from rapidy.http import get, QueryParams
@get('/')
async def handler(
query_params_data: dict[str, str] = QueryParams(),
) -> ...:
# {'query': ..., 'star_rating': ...}
Извлечение без валидации
Отключение валидации не рекомендуется.
Если отключить валидацию, параметр вернёт базовую структуру aiohttp:
QueryParam-strQueryParams-MultiDictProxy[str]
Способы отключения валидации
Явное отключение
from rapidy.http import get, QueryParam, QueryParams
@get('/')
async def handler_1(
query: int = QueryParam(validate=False)
) -> ...:
# ...
@get('/')
async def handler_2(
query_params_data: int = QueryParams(validate=False)
) -> ...:
# <MultiDictProxy('query': ..., 'star_rating', ...)>
Использование Any
from typing import Any
@get('/')
async def handler_1(
query: Any = QueryParam(),
) -> ...:
# ...
@get('/')
async def handler_2(
query_params_data: Any = QueryParams(),
) -> ...:
# <MultiDictProxy('query': ..., 'star_rating', ...)>
Отсутствие аннотации типа
Если тип не указан, по умолчанию используется Any.
@get('/')
async def handler_1(
query=QueryParam(),
) -> ...:
# ...
@get('/')
async def handler_2(
query_params_data=QueryParams(),
) -> ...:
# <MultiDictProxy('query': ..., 'star_rating', ...)>
Значения по умолчанию
Значение по умолчанию для QueryParam будет использоваться, если в поступившем запросе не будет найден query-параметр с таким именем.
Значение по умолчанию для QueryParams будет использоваться, если в поступившем запросе не будет найдено ни одного query-параметра.
Использование default
from typing import Annotated
@get('/')
async def handler(
some_query_param: Annotated[str, QueryParam(default='SomeValue')],
) -> None:
from typing import Annotated
@get('/')
async def handler(
some_query_param: Annotated[str, QueryParam()] = 'SomeValue',
) -> None:
Использование default_factory
@get('/')
async def handler(
some_query_param: str = QueryParam(default_factory=lambda: 'SomeValue'),
) -> None:
from typing import Annotated
@get('/')
async def handler(
some_query_param: Annotated[str, QueryParam(default_factory=lambda:'SomeValue')],
) -> None:
Нельзя одновременно использовать default и default_factory.
При попытке задать оба параметра будет вызвано исключение pydantic:
Предупреждения и особенности
Использование QueryParam и QueryParams одновременно
Невозможно использовать QueryParam и QueryParams одновременно в одном обработчике.
@get('/')
async def handler(
query: str = QueryParam(),
query_params_data: QueryParamsData = QueryParams(),
) -> ...:
При запуске приложения будет вызвано исключение AnotherDataExtractionTypeAlreadyExistsError.
------------------------------
Attribute with this data extraction type cannot be added to the handler - another data extraction type is already use in handler.
Handler path: `main.py`
Handler name: `handler`
Attribute name: `headers_data`
------------------------------
Атрибут alias в QueryParams
Атрибут alias не работает в параметре QueryParams().
@get('/')
async def handler(
query_params_data: QueryParamsData = QueryParams(alias='SomeName'), # <-- alias not working
) -> ...:
Как извлекаются сырые данные
Rapidy используется метод rel_url.query объекта Request, после чего полученные данные передаются в pydantic для валидации.
Как происходит извлечение внутри Rapidy
Rapidy использует встроенные механизмы aiohttp.
Подробнее об объекте aiohttp.Request и методах извлечения данных можно узнать
здесь.