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

Параметры запроса

Данный раздел покажет, как можно извлекать и проверять 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 - str
  • QueryParams - 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

@get('/')
async def handler(
    some_query_param: str = QueryParam(default='SomeValue'),
) -> None:
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:

TypeError('cannot specify both default and default_factory')

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

Использование 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

async def extract_query(request: Request) -> MultiDictProxy[str]:
    return request.rel_url.query

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

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