因为一开始用 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)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.