因为一开始用 fastapi 觉得很不错,但又觉得不是很完美,自己更喜欢 starlette,所以才写了这个库—pait。这个库核心逻辑很简单,但写了快一年,库名还被我写错了,去年 8.9 月的时候主体逻辑就写完了,然后就经历了一段 996 停了下来。经过最近不断的修修补补,勉强能用了。
pait依赖于Pydantic
(但支持延迟注解)和inspect
,主要功能是参数检验和文档生成。
参数检验用法跟 fastapi 差不多,文档输出功能还在逐渐完善中,理论上可以支持很多 web 框架,不过我现在基本只用 flask
和starlette
。
import uvicorn
from pydantic import BaseModel, conint, constr
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
# 创建一个基于 Pydantic.BaseModel 的 Model
class PydanticModel(BaseModel):
uid: conint(gt=10, lt=1000) # 自动校验类型是否为 int,且是否大于 10 小于 1000
user_name: constr(min_length=2, max_length=4) # 自动校验类型是否为 str, 且长度是否大于等于 2,小于等于 4
# 使用 pait 装饰器装饰函数
@pait()
async def demo_post(
# pait 通过 Body()知道当前需要从请求中获取 body 的值,并赋值到 model 中,
# 而这个 model 的结构正是上面的 PydanticModel,他会根据我们定义的字段自动获取值并进行转换和判断
model: PydanticModel = Body.i()
):
# 获取对应的值进行返回
return JSONResponse({'result': model.dict()})
app = Starlette(
routes=[
Route('/api', demo_post, methods=['POST']),
]
)
uvicorn.run(app)
1
abersheeran 2021-04-18 00:09:40 +08:00
支持,已 Star 。顺便打个广告,如果你喜欢 starlette 这种直接面向 ASGI 的,可以试试 https://github.com/abersheeran/baize WSGI/ASGI 双协议写起来几乎一样。
|
2
so1n OP @abersheeran 那时候这个框架还没成型时还想跟你们一起完成 你还建了群 后面我就 996 停下来了...
|
3
fy 2021-04-19 02:23:03 +08:00
还不错,明天试试。这个应该是把封装函数的 request 吃掉然后做各种操作吧?
读了一遍文档,初步印象中唯一一个槽点是`Body.i()` 中的 `.i()` 有点摸不着头脑。 说起来 fastapi 那个 query 校验真是僵硬的不行;还有文档生成不支持自定义不说,居然会把 pydantic 手动修改的一些 schema 列移除掉,就很奇怪 |