本文原发布于公众号Python编程实战FastAPI为一,并发性能媲美NodeJS和Go。它基于Starlette框架,类似于Starlette的子类。最近一直在使用和学习FastApi。与我之前使用的框架相比,性能确实有了很大的提升。使用后有如下感触:性能上更多的是并发,支持基于Pydantic类型声明的异步async,自动标定测试参数自动生成交互API接口文档。上手容易,确实可以快速码字,快速上手。工作中看了两天文档,把已有的一个服务改成了FastApi服务。配合gunicorn+uvicorn已经部署,最近测试没出现问题。由于之前大量使用Flask,在FastAPI上隐约可以看到Flask的影子,两者的设计范式非常相似。例如:一个更大的应用服务多文件多url处理函数,在Flask中称为蓝图,在FastApI中对应APIRouter[](https://mp.weixin.qq.com/s/JR...)上面提到的APIRouter和Flask非常相似,比如创建一个简单的FastAPI服务fromfastapiimportFastAPIapp=FastAPI()@app.get("/")asyncdefindex():return"Helloworld"@app.get("/items/{item_id}")asyncdefread_item(item_id:str,q:str=None,short:bool=False):item={"item_id":item_id}ifq:item.update({"q":q})ifnotshort:item.update({"description":"Thisisanamazingitemthathasalongdescription"})returnitem上面代码中有两个视图函数和url路径,现在是case看起来不错,但是如果服务中有10个或更多的视图函数怎么办?这个时候不建议把它们写在一个文件里,因为代码不好维护,看起来臃肿。这时候就要考虑把视图函数分文件了。APIRouter这为我们提供了在多个文件中注册路由的能力。类似于生活中常用的电源板,它可以提供更多的插座来插入电器插头,然后我们最后只需要将一个或多个电源板(APIRouter)插入主线(app=FastAPI())即可例如,服务中有两个应用模块,combination和level分别对应两个应用模块,通过APIRouter注册它们的路由,用法如下:combination.pyfromfastapiimportAPIRouterrouter=APIRouter()@router.get("/users/",tags=["users"])asyncdefread_users():return[{"username":"Foo"},{"username":"Bar"}]@router.get("/users/me",tags=["users"])asyncdefread_user_me():return{"username":"fakecurrentuser"}对应的level.py也可以这样写,但是会不会发现创建了两个APIRouter()对象?是的,官方文档就是这样的例子,你甚至可以创建更多。但是,我认为为两个应用程序创建两个路由器有点“浪费”。能不能这样:只创建一个路由器,然后在每个模块中导入创建的路由器。当然,这也是可能的。效果是一样的。这部分是一个单独的文件。创建路由器,代码很简单,但是记得导入模块对应的视图函数,routers.pyfromfastapiimportAPIRouterrouter=APIRouter()from..combinationimportviewsfrom..level2importviews接下来就是导入上面在模块视图中创建的函数routerfromapp.routersimportrouter@router.get("/users/",tags=["users"])asyncdefread_users():return[{"username":"Foo"},{"username":"Bar"}]@router.get("/users/me",tags=["users"])asyncdefread_user_me():return{"username":"fakecurrentuser"}另一个模块是也是同样的方式导入,代码是不贴了,看懂就可以了RegisterAPIRouter最后一步就是将我们的APIRouter注册到核心对象中,就像前面的例子一样,把插板插入主线插座,导入FastApifromfastapiimportFastAPIappaswecreatedthemainfilebefore=FastAPI()app.include_router(routers.router,prefix="/api")include_router()函数是t上面提到的注册。就是这样,只需使用应用程序启动服务即可。当然也可以把核心对象包装成函数返回,然后在主目录调用start,defcreate_app():app=FastAPI()app.include_router(routers.router,prefix="/api")返回app主目录创建一个main.py文件调用start,fromappimportcreate_appapp=create_app()启动命令:uvicornmain:app--host=0.0.0.0--port=8800ArtiPub自动发布文章,多发帖平台
