Параметры запроса
Данный раздел покажет, как можно извлекать и проверять 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
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
и методах извлечения данных можно узнать
здесь.