跳转至

介绍

使用Pait来进行参数类型转换与参数校验非常简单,以示例的代码为例子:

import uvicorn  # type: ignore
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route

from pait.app.starlette import pait
from pait.field import Body


# 使用pait装饰器装饰函数
@pait()
async def demo_post(
    uid: int = Body.i(description="user id", gt=10, lt=1000),
    user_name: str = Body.i(description="user name", min_length=2, max_length=4)
) -> JSONResponse:
    # 获取对应的值进行返回
    return JSONResponse({'result': {'uid': uid, 'user_name': user_name}})


app = Starlette(
    routes=[
        Route('/api', demo_post, methods=['POST']),
    ]
)

uvicorn.run(app)
代码中其中第11行是Pait的核心,Pait的所有运行功能都在这个装饰器中实现。首先Pait会通过inspect获取到函数对应的函数签名,并通过函数签名生成一个pydantic.BaseModel对象, 然后通过该对象校验和转换请求点值并根据函数签名返回给函数对应的参数。

而13,14行代码则是开发者自己填写的参数, 开发者在编写函数时, 只要把函数的参数都写成类似于<name>:<type>=<default>格式的关键参数即可,这种写法除了符合Python的关键参数标准外, Pait还会赋予其它的意义:

  • name为参数名, 在大多数情况下会作为Key来中请求资源获取对应的值
  • type为值对应的类型,Pait会用它来做参数校验和转化
  • default则是Paitfield对象,不同的field代表从不同的请求类型获取值, 而对象的属性则告诉Pait该如何去预处理从请求中获取的值。

以上面的uid参数为例子,Pait会通过Body从请求中的获取Json数据,接着以uid为Key从Json数据中获取对应的的值并转化或验证是否为int类型, 最后再判断该值是否处于10-1000之间,如果不是就直接报错, 如果是则赋值给uid这个变量。

Note

直接使用Body()时, mypy会检查到类型不匹配, 而Body.i()则可兼容这个问题, 一般情况下建议直接使用Body.i()。

回到页面顶部