请求注入
简介
如果你想在endpoint中获取HTTP请求的query参数、路径参数或body参数,lessweb推荐使用参数注入的方式,即框架自动为endpoint的带类型参数赋值。
- keyword-only参数:可注入路径参数和query参数。当路径参数和query参数同名时,优先注入路径参数。
- positional-only参数: 对于POST/PUT/PATCH方法的请求,可注入JSON反序列化后的request body;
对于其他方法(GET,DELETE等)的请求,可注入路径参数和query参数的聚合dict。 - 普通参数:即positional-or-keyword参数,可注入上下文变量,例如:
request: Request
等。
示例
from aiohttp.web import Request
from datetime import date
from enum import Enum
from lessweb import get_mapping, post_mapping
from typing import TypedDict
class PetKind(Enum):
CAT = 'CAT'
DOG = 'DOG'
class Pet(TypedDict):
pet_id: int
name: str
kind: PetKind
birthday: date
@get_mapping('/pet/{pet_id}')
async def get_pet_detail(request: Request, *, pet_id: int, kind: list[PetKind] = None):
return {
'name': request.query['name'],
'pet_id': pet_id,
'kind': kind
}
@post_mapping('/pet')
async def create_pet(pet: Pet, /):
return pet
验证请求
>>> import requests
>>> print(requests.get('http://localhost:8080/pet/123?name=Kitty&kind=CAT,DOG').text)
{"params": {"pet_id": "123", "name": "Kitty", "kind": "CAT,DOG"}, "name": "Kitty", "pet_id": 123, "kind": ["CAT", "DOG"]}
>>> print(requests.post('http://localhost:8080/pet', json={'name': 'Kitty', 'kind': 'CAT', 'birthday': '2000-12-31'}).text)
{"pet_id": 0, "name": "Kitty", "kind": "CAT", "birthday": "2000-12-31"}
支持的参数类型
lessweb框架默认支持请求参数转换为如下类型:
- 基础类型:
str
: 输入必须为str类型。int
,float
,bool
: 输入可以是str类型,当输入是str类型时框架会用json.loads()
解析。dict
: 不支持输入为str类型。支持泛型(注意要从python3.9才支持dict[...]
和list[...]
形式的泛型语法)。list
: 输入可以是str类型,框架会使用csv格式解析。支持泛型。是否支持基础类型的派生类与orjson.dumps()
保持一致。
dataclass: 原生支持反序列化为dataclasses.dataclass
(python3.7+)实例。支持继承。支持泛型。- TypedDict: 原生支持反序列化为
typing.TypedDict
(python3.8+)实例。注意要从python3.11才支持自定义Required/NotRequired
。支持继承。不支持泛型。 - datetime:
datetime.datetime
:输入需符合RFC 3339格式,例如:“1970-01-01T00:00:00+00:00”。datetime.time
datetime.date
- enum: 根据枚举值反序列化。不支持泛型。
numpy: 包括numpy.ndarray
,numpy.float64
,numpy.float32
,numpy.int64
,numpy.int32
,numpy.int16
,numpy.int8
,numpy.uint64
,numpy.uint32
,numpy.uint16
,numpy.uint8
,numpy.uintp
, ornumpy.intp
, andnumpy.datetime64
等实例。uuid.UUID
: 输入需符合RFC 4122格式,例如:"f81d4fae-7dec-11d0-a765-00a0c91e6bf6"。- Union: 框架会按顺序依次尝试转换(注意要从python3.10才支持
X | Y
形式的语法) - Literal: 框架会按顺序依次比较。
- NewType: 框架通过
NewType(name, tp).__supertype__
获取原类型并尝试继续转换。