FastAPI最近比较火,自从看到这款框架后就一直在关注着。据官方文档上的介绍它是一个并发性可以和 NodeJS 以及 Go 相媲美的 web 框架,具有强大的性能

本人最近也是一直在使用和学习 FastApi,相比之前用的框架性能确实有很大的提升,用完后有如下几点感受:

  • 性能并发更强了,支持异步 async

  • 基于 Pydantic 的类型声明,自动校验参数

  • 自动生成交互式的 API 接口文档

  • 上手简单,能快速编码

上手快是真的,上班期间零零散散的看了两天文档,就将现有的一个服务改成 FastApi 服务了,配合 gunicorn+uvicorn 部署,最近测试也没出现什么问题。

由于之前 Flask 用的比较多,在 FastAPI 上隐隐约约能看到 Flask 的影子,两者的设计范式很类似。

例如:更大的应用程序服务多文件多 url 处理功能,在 Flask 中称之为蓝图的,对应 FastApI 中的 APIRouter

Flask 蓝图机制及应用

使用 APIRouter

上面说过和 Flask 非常的类似,比如创建一个简单的 FastAPI 服务

from fastapi import FastAPIapp = 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 个或者更多呢?这时候就不建议写在一个文件里面了,因为代码不易维护且显得臃肿

这时候便要考虑将视图函数分文件处理了,APIRouter 就给我们提供了在多个文件中注册路由的功能。

类似生活中的常用的插线板,能提供更多的插口插入电器插头,然后我们最终只需要将这一个或多个插线板 (APIRouter) 插到主线路 (app = FastAPI() ) 即可

比如服务中两个应用模块,combination 和 level 分别对应两个应用模块,通过 APIRouter 来对其路由进行注册,用法如下:

combination.py

from fastapi import APIRouterrouter = 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 APIRouterrouter = 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 FastAPIapp = 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_appapp = create_app()

启动命令:

uvicorn main:app --host=0.0.0.0 --port=8800

作者:华为云特约供稿开发者  Python编程与实战

全面拥抱 FastApi — 多应用程序项目结构规划相关推荐

  1. 健康菜谱微信小程序+项目前后台源码(JavaSSM+Mysql)

     博主介绍:✌在职Java研发工程师.专注于程序设计.源码分享.技术交流.专注于Java技术领域和毕业设计✌ 项目名称 健康菜谱微信小程序+项目前后台源码(JavaSSM+Mysql) 视频效果 ht ...

  2. 微信小程序项目(SECTION A)

    我们首先说一说什么是微信小程序和微信云开发(都是自己一个字一个字打的 = =) 微信小程序是一种不需要下载,进入微信就可以直接打开的软件,已经有成千上万的开发者加入了它的开发,一起推动了微信小程序的发 ...

  3. 做完小程序项目、老板给我加了6k薪资~

    2019独角兽企业重金招聘Python工程师标准>>> 大家好,这里是@IT·平头哥联盟,我是首席填坑官--苏南(South·Su),今天要给大家分享的是最近公司做的一个小程序项目, ...

  4. 微信小程序项目重构之Redux状态管理

    1.以往处理状态的一些方式 第一种:App上挂globalData 这种方式就是直接写在App里面啦,取值赋值比较方便 App.js App({globalData: {name: '前端学者',// ...

  5. 实战SSM_O2O商铺_03项目结构规划及Maven配置

    文章目录 项目结构规划 Maven配置 Github地址 项目结构规划 按照功能在 com.artisan.o2o下新建几个package ,如上所示. spring相关的配置文件放在/src/mai ...

  6. 微信小程序【腾讯云开发】创建并上线小程序项目(涉及-数据库操作)

    学习 视频 网址 :[云开发实战]30分钟创建并上线小程序项目 https://www.bilibili.com/video/BV1Pc411h7RU 视频-项目-源码 : 链接 : https:// ...

  7. 小程序 --- 项目小练手Ⅰ

    1. 接口文档 2. 帮助文档 小程序开发文档 mdn 阿里巴巴字体 iconfont 3. 项目搭建 3.1 新建小程序项目 填入自己的appid: wxdbf2b5e8c2f521a3 3.2 文 ...

  8. gradle创建web工程_Gradle入门:创建Web应用程序项目

    gradle创建web工程 这篇博客文章描述了如何使用Gradle创建一个Web应用程序项目. 更具体地说,我们想创建一个使用Java的Web应用程序项目,将我们的Web应用程序打包到WAR文件中,并 ...

  9. Gradle入门:创建Web应用程序项目

    这篇博客文章描述了如何使用Gradle创建一个Web应用程序项目. 更具体地说,我们想创建一个使用Java的Web应用程序项目,将我们的Web应用程序打包到WAR文件中,并在开发环境中运行我们的Web ...

最新文章

  1. java switch 应用
  2. java 伪异步 netty,Netty(一) - 不死的达芬奇的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 2.5 网络中的网络及1x1卷积-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. 想做跨境的卖家新起点在哪里?亚马逊“封店潮”来袭,商家该何去何从
  5. CSDN博客 专用备份工具
  6. 刘浩(专业打劫三十年)20155307的预备作业02:
  7. 大学生计算机二级大集报名最好,在校大学生如何报名计算机二级?
  8. word2vec python 代码实现_python gensim使用word2vec词向量处理中文语料的方法
  9. c mysql bulk,MySqlBulkLoader批量上传遇到的问题和解决方法
  10. ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
  11. 【BZOJ2326】【codevs2314】数学作业,第100篇博文纪念
  12. 光信噪比 (OSNR) 的概念及其重要性
  13. 如何用阿里云服务器建立一个wordpress网站?
  14. 9. 设计二个函数分别计算sinx和cosx_Excel技巧篇(一):超级好用的几个函数
  15. IS-IS和OSPFv2对比
  16. Python2.7学习笔记-定义函数、filter/map/reduce/lambda
  17. 小米8屏幕指纹版(UD) 稳定版miui11刷magisk、太极参考
  18. App下载的视频导进电脑中生成.mp4文件的方法
  19. 在埋头写程序学技术的同时,有没有想到你们的老板和上司在搞什么?
  20. 未来瓶窑的交通生命线与发展规划

热门文章

  1. Vrep 中的运动规划1(主要是基于RRT算法)
  2. 视觉SLAM笔记(56) 位姿图优化
  3. matlab中if可以判断或语句吗,matlab中if 语句后面的判别式不能是算术表达式?或者说变量?...
  4. 电脑很卡反应很慢该如何处理_我的苹果电脑中毒了,好开心
  5. JFreeChart的简单应用及乱码解决
  6. 在ASP.NET 中实现单用户登录(利用Cache, 将用户信息保存在服务器缓存中)[转]
  7. php静态登录界面代码,JSP_JSP登录验证功能的实现,静态的登录界面的设计login.htm - phpStudy...
  8. zabbix设置mysql登陆免报警_zabbix3.0.2 监控mysql服务down的时候不触发报警的问题修复...
  9. java一致性hash api_一致性哈希算法学习及JAVA代码实现分析
  10. python爬取商品信息_Python基于BeautifulSoup爬取京东商品信息