高手问答第 294 期 —— Python下如何利用FastAPI框架开发实用、快捷的Web商业系统?

OSC哒哒 发布于 11/22 13:53
阅读 2K+
收藏 9

NGINX Sprint China 2022--NGINX年度旗舰盛会,已开启免费预约!>>>

在全民互联网的今天,一款好使的Web商业系统,首先需要支持大并发的访问量,以满足用户的快速访问需求。在Python技术体系下,大并发响应性能最优的当属FastAPI轻量级框架,其响应性能可以跟Node.JS和Go媲美,主要受益于它是异步技术框架。

Python技术体系下提供了大量的人工智能开发框架,把人工智能技术、大数据技术融合并工程化是软件开发人员必须面对的一个问题,FastAPI为此提供了很好的Web工程化技术支撑。FastAPI支持前后端分离开发,并支持FastAPI与Django混合开发,具有强大的工程实践能力。

与Django、Flask框架相比较,Django是Python下重量级的开发框架,集成了大量的后端公共功能模块,拿来稍微完善一下就可以使用。但是它也存在一些问题,比如高度集成了关系型数据库的操作支持,对NoSQL集成未作考虑,存在NoSQL数据库接入开发难度大的问题。另外,在异步技术上与FastAPI存在很大差距。Flask 仅适用于中小规模的Web开发,不支持异步技术,无法解决大规模并发访问问题。

此外,FastAPI也有高效编码、更少代码开发Bug、智能代码编辑等优点。

OSCHINA 本期高手问答 (11 月 23 日 - 11 月 29 日) 我们一起探讨“Python下如何利用FastAPI框架开发实用、快捷的Web商业系统”的话题,做客高手问答的嘉宾是畅销书《Python FastAPI Web开发从入门到项目实战》的作者 刘瑜、安义和喻小菲 老师。

可讨论的问题包括但不限于:

  • 如何利用FastAPI快速构建Web商业应用程序?
  • 如何实现MongoDB、Redis的集成开发?
  • 如何实现FastAPI和Django混编?
  • 如何实现FastAPI和前端Vue.js同步开发?

有其他相关的问题,也欢迎提问。

嘉宾介绍

刘瑜,高级信息系统项目管理师,具有20多年C、ASP、BASIC、FoxBASE、Delphi、Java、C#、Python等编程经验,软件工程硕士、硕士企业导师、大数据重点实验室主任。开发过商业项目20余套,承担省部级千万级别项目5个,发表国内外论文10余篇。出版了《战神——软件项目管理深度实战》《NoSQL数据库入门与实践》《Python编程从零基础到项目实战》《Python编程从数据分析到机器学习实践》《算法之美——Python语言实现(微课视频版)》《Python Django Web从入门到项目实战》《Python FastAPI Web开发从入门到项目实战》。

安义,系统架构师,部门经理,具有20多年软件开发经验,主导过多个行业(医疗、教育、互联网、地产、游戏、汽车、餐饮等)的软件系统开发工作。熟悉多种开发语言和开发框架,具有丰富的软件实战经验。曾是腾讯公司负责袋鼠跳跳应用的研发负责人,目前为“三酷猫”团队的软件技术总监。《Python Django Web从入门到项目实战》《Python FastAPI Web开发从入门到项目实战》第二作者。

喻小菲,专职软件高级工程师,10余年软件项目开发经验,FastAPI专业技术群群主,承担过物联网、游戏、网络安全等10多个商业项目。主要从事Python Web方向的开发工作,对FastAPI、Sanic、Django、Flask等网络框架均有研究,始终追踪Python开发最前沿的发展方向,具有丰富的Python Web开发经验。

为了鼓励踊跃提问,我们会在问答结束后从提问者中抽取 5 名幸运会员赠予《Python FastAPI Web开发从入门到项目实战》一书。

京东购书:

https://item.jd.com/10062939804784.html#none

天猫有售:
https://detail.tmall.com/item.htm?abbucket=14&id=688018990716&rn=9918a277021797d2c811ad4111db3886&spm=a1z10.3-b-s.w4011-22696760641.22.593ab832LiOz4i

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家向 刘瑜、安义和喻小菲老师 积极提问,直接回帖提问即可。

加载中
1
iman123
iman123

@zergan  刘瑜和安义老师  你好,我有以下几个问题想请教一下:
1. 关于协程,最近正好写过一个程序,使用asyncio以及threading,感觉threading性能要好一点,可能能利用的cpu资源更多一些,asyncio仅仅是所有操作都在主线程里面,我想问一下什么情况下使用asyncio优于threading
2. 我个人是比较倾向于使用轻量级的web框架,所以大而全的Django就不怎么喜欢,之前也在一些小的个人项目里用过Flask,但是文中你提到Flask 仅适用于中小规模的 Web 开发,不支持异步技术,无法解决大规模并发访问问题。除了这些增强特性外还有没有其他差异呢,能不能具体展开讲述一下,FastAPI 算是轻量级的框架么,很多功能模块是不是都依赖于第三方,类似于nodejs里面的express、koa?
3. FastAPI 目前的生态怎么样,我看目前 https://github.com/tiangolo/fastapi 的 stars是 51.8K, https://github.com/pallets/flask的 stars是 61.1K,感觉差不多,都还算比较流行热门的,两者底层实现有什么区别呢,例如底层是纯python还是c++封装的?
4. Python领域我记得还有Tornado(https://www.python-me.org/tornado)、Bottle(https://github.com/bottlepy/bottle)这些,与FastAPI相比怎么样?
5. 我在搜索引擎bing里面搜索python web framework,FastAPI 出现的频率明显没有Django、Flask多,是因为比较新么?例如 https://theninehertz.com/blog/top-frameworks/python-web-frameworks、https://www.monocubed.com/blog/top-python-frameworks/ 、 https://pythonbasics.org/python-web-frameworks/

zergan
zergan
Python中,由于GIL(全局解释器锁)的存在,并不能发挥出线程的优势,也就是说,使用多线程时,全局同一时间内,只有一个解释器存在,线程切换是有代价的。 而asyncio是在一个线程内执行,不存在切换线程的效率问题。 您后面列出的web框架,我基本上都使用过,以前用得最多的还是django全家桶。 对于框架的选择,我的观点是:第一看用途(CRUD还是高并发),第二看社区(RIP web.py)。
0
赤脚小子
赤脚小子

@zergan hi, 我看你们重点强调了FastAPI的异步特性带来的高性能,那我就就异步提一些问题。

1. FastAPI说异步阻塞还是异步非阻塞?

2. 我先假设是异步非阻塞,那是否实现了backpressure?

3. FastAPI是响应式编程么?基于什么模型做的,reactor?

4. 如果是响应式了,之前python生态的比如security层和db层的组件都不能用了吧,是怎么解决这部分问题的,fastapi自带解决方案还是依赖其他开源实现?

谢谢

wei2011
wei2011
回复 @chise : sqlalchemy从1.4开始已经支持异步了,而更完善的2.0版本正在beta4版本,马上就要出来了
c
chise
4 python的协程功能已经很多年了,相关的第三方包都很丰富,基本上所有需要的模块都有对应的异步版本。如果依赖的包确实没有异步版本,可以通过异步封装把同步任务异步化(比如sqlalchemy对多对多的延迟查询的异步支持方式)
c
chise
1 fastapi的异步是基于async await的关键字的异步,本质上是基于协程的上下文调度。属于异步阻塞。 2 python里面没有backpressure概念。当然如果使用了异步任务队列(例如celery)会有这个概念,但是fastapi框架本身不需要考虑。(百度了一下,只在rxjava看到了这个东西) 3 建议去看一下python的协程相关的教程。python异步基于事件驱动
0
开源博客
开源博客

@zergan 请问3个问题:

  1. FastAPI对不同前端构架的配合有何功能性或便捷性区别,如Vue、React?
  2. FastAPI对后端渲染的支持配置如何?
  3. FastAPI在Windows平台上有什么限制?
zergan
zergan
1. FastAPI是一个后端框架,为前端提供基于HTTP协议的数据接口,对于前端框架没有要求和限制。 2.您说的后端渲染是指的类似于Nuxt.js这类前端技术吧,这个并不包含在FastAPI之内, FastAPI可以使用Jinja之类的传统模板制作页面。 3. FastAPI的异步基于Linux内核的epoll(FreeBSD中的kqueue)只能在Linux(BSD)上才可以发挥出异步的性能。
0
shede333
shede333

@zergan FastAPI的插件生态如何?

zergan
zergan
FastAPI框架提供了一种依赖注入的管理方案,类似于Java中的IoC(控制反转)。 通过依赖注入可以对模块进行解藕。 FastAPI本身的实现也是遵守这个依赖注入的规范的。对于使用者引入的功能模块以依赖注入的方式存在,也就是引入的功能模块的功能和稳定性由模块自身来保证。Python生态中的模块都可以集成到FastAPI中。
0
温柔如斯
温柔如斯

@zergan 使用 fastAPI 异步编程情况下,如何保证事务的处理?保证事务的一致性及上下文的相关性?

温柔如斯
温柔如斯
回复 @chise : 接口幂等?比如我有a,b,c三个请求,a是耗时操作。b执行事务,事务中需要A的结果。这时候是不是没办法将ABC三个请求,异步同时触发了。 因为设计中B的事务失败,A的请求也不生效的。
c
chise
一般情况下,orm的事务任务是独立的db连接,所以通过传递连接id的情况下即可实现事务的上下文相关性。
0
半世逍遥
半世逍遥

说fastapi快, 有没有数据依据, 比如压测报告, 例如云主机 4cpu, 多高的频率,  8G内存, 10M带宽下, 多少并发 qps等数据支持@zergan

zergan
zergan
网上可以找到很多评测,而这些评测都是基于最简数据模型的简单量化,实际项目中会有更多的外部不确定因素,所以我们对“评测”的关注度并不高。 官方是根据实现机制上得出的“快”,也就是来自于Linux内核级的IO事件处理机制:epoll(freebsd中是kqueue)。 所以如果在windows上做评测,效果会非常差。 异步模型提升了处理器的使用率,减少了线程切换时间,从而得出的“理论依据”
0
欢乐马l
欢乐马l

@zergan老师好,有fastapi+vue3推荐的开源项目地址吗

Come ons
Come ons
这本书最后几章就是fastapi+Vue.js3.0的商业代码案例
0
小xu中年
小xu中年

@zergan  不知道fastapi安全性如何?比如有没有xss、csrf插件?相比py4web怎么样呢?

Come ons
Come ons
fastapi主体定位于后台框架,您提的xss,csrf都是前端框架的安全插件。fastapi本身通过fastapi.security模块提供了OAuth身份验证等安全预付机制
0
pyboy58
pyboy58

@zergan  1.  fastapi如何实现 MongoDB、Redis 的集成开发?  fastapi 如果要和大数据相关的数据库结合可以吗?fastapi和doris结合?

2.这种异步编程的方式,  是支持了异步技术,并发访问时,会不会有数据延时的问题,读了是老的数据?怎么解决这种异步编程,数据不一致的缓存问题?

3. 

zergan
zergan
1. fastapi是一个异步web框架,可以用异步编程的方式处理请求和响应过程,而对于数据库等第三方框架来说,是否支持异步就要依赖于数据库的驱动是否提供了异步API。 2. 并不是使用了异步的web框架,所有的东西就都变成异步了, FastAPI支持了网络请求,也提供了依赖注入的方式集成第三方框架。但是访问数据的策略还需要根据具体的框架处理,比如脏读、缓存都是数据访问的策略,不是web框架的范围
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部