从Flask到FastApi

简介: 从Flask到FastApi

大家好,这里是米洛,一个想和大家一起分享测试开发相关的技术,面试经验和成长经历的博主!

从Flask到FastApi


上次我们已经拿到了FastApi体验卡,并且搭建了一个demo服务。说好的要开始学FastApi,那怎么能从入门到放弃呢?

所以我稍稍看了一下文档,理了一下他里面的门路。所以这篇文章可以算是私货吧,由官方文档加上个人理解组成。我打算先完善比较重要的功能,剩下的到用到的时候再切换就行了。

为了方便大家能从Flask无缝切换到FastApi,我也经过一定的实践,结合自己的项目特意编写了这篇文章,可能有些地方没有考虑到,希望大家见谅。文章有点点长,可以不用一口气看完~留着后面啃也可以!

1. 配置项目改造


我们之前会给Flask的app(pity)初始化一个配置:

17.jpg

image

其实配置还有一种用法,就是直接引入Config类,利用Config.字段去获取配置项,所以我们在原项目里面取配置的方法都要修改。

2. Cors跨域修改


18.jpg

image

Flask支持跨域很简单,引入CORS,将app套进去即可。

其实FastApi也不难,其中官网就有对应的例子:

19.jpg

image

通过引入FastApi自己封装好的CORSMiddleware,即可达到一样的效果。

3. 支持Debug


因为按照我们上一篇的内容,我们通过uvicorn启动了FastApi服务,但是由于我们是在终端(Terminal)运行的,所以其实打的断点是无法起作用的,所以我们需要通过运行main.py来达到调试的目的,官网也有类似的教程。

20.jpg

image

首先导入uvicorn库,然后通过uvicorn.run来运行对应的app,我经常提到的app,其实是一个FastApi的实例的概念。虽然我给他取名叫pity,但是我有时候也会叫他app,希望不要给大家带来困扰。

注意,我这边run方法接受了4个参数,host和port就不多说了,dddd。

reload呢,就是热更新的意思。

至于app='main:pity',main代表的是这个文件的名字: main.py,pity也就是app的名字。main:pity即代表当前要启动的是main里面的pity。

至于为什么要这么复杂,归根结底还是这个reload参数,为了能热更新,它需要这些信息,不然会报错:

21.jpg

image

22.jpg

image

所以,都是被逼的。

4. Flask-Sqlalchemy变更


其实这个不太属于这块内容,因为有的人甚至没有用到这个模块。

用sqlalchemy的同学可以跳过哦!

其实解决方法呢,就是换成sqlalchemy。所以我们需要按照sqlalchemy的格式去编写ORM。

  • 修改models/init.py

23.jpg

image

可以看到我这边读取链接URL,是通过Config来直接获取的。

  • 改造models/user.py
    随便以user.py为例子:

24.jpg

image

构造函数可不变,Use类继承的对象就是models/init.py里面的Base类,需要注意的是: sqlalchemy需要tablename这样一个字段,所以我们需要给它加上,它不会默认生成,不加就报错。其他地方基本上没有差异。

  • 改写增删改查部分

25.jpg

image

注册用户为例,改写方法是去掉以前的User.query.filter_by(),改为session.query(User).filter_by(),其他的时候差距不大。

注意为什么要用with,因为with执行完毕之后会自动调用exit(),也就是会自动关闭session

5. 参数校验部分


FastApi呢,和Pydantic进行了强强结合,虽然这一块我还摸得不是很清楚,不过我暂时可以用起来了。

先看下旧版本的,人肉校验器:

26.jpg

image

新版本的话,等于说是把参数校验和业务逻辑解耦了,参数校验放到另外的地方去编写,接口里面只负责处理业务逻辑即可。

新版本接口:

27.jpg

image

一切的核心都在于这个UserDto

28.jpg

image

可以看到,我们为UserDto类指定了4个字段,因为都是必填项,所以未加上默认值,如果我们需要email是非必填的,则要改成:


class UserDto(BaseModel):
    name: str
    password: str
    username: str
    email: str = None

接着就是具体的校验方法了,由于我们的校验规则很简单,所以对所有字段都是采取的一个方法: field_not_empty

意思是字段不能为空字符串,否则抛出ParamsError,注意这个ParamsError是我自定义的错误类型,它继承了ValueError。

29.jpg

image

  • 进阶
    由于我们的字段校验不通过的返回格式是这样的:

30.jpg

image

但是这个字段呢,是pydantic帮忙校验好的,所以我们需要添加这么一个方法:

31.jpg

image

这个方法是针对请求参数校验失败的处理,类似于一个hook,只有请求参数校验失败了,才会走到这个步骤。虽然里面错误信息多,但是我们只取第一条错误信息,不然数据多了展示不方便。

32.jpg

image

接着我们定义了一个错误字典,目前支持missing,params(自己封装的), not_allowed(参数类型不一致)

看看效果

33.jpg

image

这样就完成了参数的校验了!

6. 蓝图


在http请求里,接口分类是很关键的事情,所以蓝图这块我们不能跳过,我们粗略讲一下。其实flask里面我们也只是用来给url分组,那我们这里也完成一样的事情就好了。

  • 编写接口

34.jpg

image

APIRouter约等于Blueprint,创建一个APIRouter实例,prefix即url的前缀。

编写接口的时候从@app.route改为@router.post/get即可,变化不大。

  • 注册router
    router的注册也很简单,和之前蓝图注册类似,通过app.include_router方法即可实现:

35.jpg

image


由于我这里只改造了user下的router,所以其他的未include进来。



相关文章
|
5月前
|
API 数据库 开发者
Python微服务框架:Flask与FastAPI的融合创新
在当今高度互联的世界中,构建可扩展、灵活和高效的微服务架构变得至关重要。Python作为一种广泛应用于Web开发的编程语言,其微服务框架Flask和FastAPI的概念与实践日益受到关注。本文将介绍这两个框架的核心概念,并探讨它们在实际应用中的强大功能和优势。
|
2月前
|
数据库连接 开发者 Python
从 Flask 迁移到 FastAPI,这简直是一场奇妙之旅!性能飙升,代码更优,快来感受这份惊喜!
【8月更文挑战第31天】作为一名开发者,从 Flask 迁移至 FastAPI 是一次充满挑战与收获的旅程。起初,Flask 的简洁性和灵活性吸引了我,但随着项目扩展,其性能局限性和较弱的类型提示支持逐渐显现。FastAPI 结合了 Flask 的简洁性和 Django 的强大功能,具备高性能、类型提示支持及自动文档生成等优势,更适合构建现代化 Web 应用。尽管迁移过程中需对现有代码进行调整,以适应 FastAPI 的类型提示和依赖注入机制,但最终应用性能和代码可维护性均显著提升,整个过程也大大提升了我的开发技能。
53 0
|
2月前
|
设计模式 API Python
Python Web:Django、Flask和FastAPI框架对比
Python Web:Django、Flask和FastAPI框架对比
74 0
|
5月前
|
缓存 监控 API
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
281 0
|
11月前
|
JSON API 数据格式
使用Python构建RESTful API:Flask和FastAPI的对比与实践
在现代Web开发中,构建RESTful API是一项常见任务。Python提供了多个框架来简化这个过程,其中Flask和FastAPI是两个备受欢迎的选择。本文将对比Flask和FastAPI,并通过实际示例展示它们的用法和优势。
|
API Python
Python Web框架:Django、Flask和FastAPI巅峰对决
Python Web框架:Django、Flask和FastAPI巅峰对决
8130 0
|
测试技术 数据库 C++
2023年是时候更新你的技术武器库了:Asgi vs Wsgi(FastAPI vs Flask)
也许这一篇的标题有那么一点不厚道,因为Asgi(Asynchronous Server Gateway Interface)毕竟是Wsgi(Web Server Gateway Interface)的扩展,而FastAPI毕竟也是站在Flask的肩膀上才有了突飞猛进的发展,大多数人听说Asgi也许是因为Django的最新版(3.0)早已宣布支持Asgi网络规范,这显然是一个振奋人心的消息,2023年,如果你在Web开发面试中不扯一点Asgi,显然就有点落后于形势了。
2023年是时候更新你的技术武器库了:Asgi vs Wsgi(FastAPI vs Flask)
|
NoSQL 测试技术 Redis
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)