第一时间获取 Python 技术干货!web
FastAPI最近比较火,自从看到这款框架后就一直在关注着。据官方文档上的介绍它是一个并发性能够和 NodeJS 以及 Go 相媲美的 web 框架,具备强大的性能编程
本人最近也是一直在使用和学习 FastApi,相比以前用的框架性能确实有很大的提高,用完后有以下几点感觉:api
-
性能并发更强了,支持异步 async -
基于 Pydantic 的类型声明,自动校验参数 -
自动生成交互式的 API 接口文档 -
上手简单,能快速编码
上手快是真的,上班期间零零散散的看了两天文档,就将现有的一个服务改为 FastApi 服务了,配合 gunicorn+uvicorn 部署,最近测试也没出现什么问题。服务器
因为以前 Flask 用的比较多,在 FastAPI 上隐隐约约能看到 Flask 的影子,二者的设计范式很相似。微信
例如:更大的应用程序服务多文件多 url 处理功能,在 Flask 中称之为蓝图的,对应 FastApI 中的 APIRouter并发
使用 APIRouter
上面说过和 Flask 很是的相似,好比建立一个简单的 FastAPI 服务框架
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
return "Hello world"
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item
上述代码中有两个视图函数以及 url 路径,如今这种状况看起来还好异步
可是若是服务中视图函数有 10 个或者更多呢?这时候就不建议写在一个文件里面了,由于代码不易维护且显得臃肿async
这时候便要考虑将视图函数分文件处理了,APIRouter 就给咱们提供了在多个文件中注册路由的功能。
相似生活中的经常使用的插线板,能提供更多的插口插入电器插头,而后咱们最终只须要将这一个或多个插线板 (APIRouter) 插到主线路 (app = FastAPI() ) 便可
好比服务中两个应用模块,combination 和 level 分别对应两个应用模块,经过 APIRouter 来对其路由进行注册,用法以下:
combination.py
”
from fastapi import APIRouter
router = APIRouter()
@router.get("/users/", tags=["users"])
async def read_users():
return [{"username": "Foo"}, {"username": "Bar"}]
@router.get("/users/me", tags=["users"])
async def read_user_me():
return {"username": "fakecurrentuser"}
相应的 level.py 也能这样写,可是你是否会发现建立了两个 APIRouter() 的对象
这样固然也是能够的,官方文档就是这样举例的,你甚至能够建立更多。不过我以为两个应用建立两个 router 感受有点 "浪费", 咱们是否能够这样:只建立一个 router ,而后在每一个模块导入建立好的 router,固然也是能够,效果同样
这部分就是另起文件,建立 router, 代码很是简单,可是记住要导入模块对应视图函数,
routers.py
”
from fastapi import APIRouter
router = APIRouter()
from ..combination import views
from ..level2 import views
接下来就是在模块视图函数中导入上述建立好的 router
from app.routers import router
@router.get("/users/", tags=["users"])
async def read_users():
return [{"username": "Foo"}, {"username": "Bar"}]
@router.get("/users/me", tags=["users"])
async def read_user_me():
return {"username": "fakecurrentuser"}
另一个模块也是同样的导入,代码就不贴了,理解就行
注册 APIRouter
最后一个步骤就是要将咱们的 APIRouter 注册到核心对象上去,就像前面举的示例将插线板插到主线路插口上
和以前咱们建立主文件同样导入 FastApi
from fastapi import FastAPI
app = FastAPI()
app.include_router(routers.router, prefix="/api")
其中 include_router() 函数就是上面说的注册。
这时候就完成了,使用该 app 来启动服务便可。固然你也能够将该核心对象包装成函数返回,而后在主目录调用启动,
def create_app():
app = FastAPI()
app.include_router(routers.router, prefix="/nlp_service")
return app
主目录中建立 main.py 文件调用启动,
from app import create_app
app = create_app()
启动命令:
uvicorn main:app --host=0.0.0.0 --port=8800

本节完!敬请期待后续更多更新
推荐阅读
THANKS
- End -
本文分享自微信公众号 - Python编程与实战(GoPy1024)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。