用它 5 分钟以后,我放弃用了四年的 Flask

2024-05-15 13:32

本文主要是介绍用它 5 分钟以后,我放弃用了四年的 Flask,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阅读本文大概需要 3 分钟。

有一个非常简单的需求:编写一个 HTTP 接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回。

如果我们使用 Flask 来开发这个接口,那么代码是这样的:

from flask import Flask, requestapp = Flask(__name__)@app.route('/insert', methods=['POST'])
def insert():info = request.jsonname = info['name']age = info['age']age_after_10_years = age + 10msg = f'此人名叫:{name},10年后,此人年龄:{age_after_10_years}'return {'success': True, 'msg': msg}

代码看起来已经很简洁了。我们用requests发个请求看看效果,如下图所示:

看起来没什么问题。

现在,我搞点破坏,把age字段改成字符串,再运行一下:

不出所料,报错了。

现在我们把age字段改回数字,但是直接移除name字段:

又报错了。

为了防止用户不按规矩提交数据,我们必须在接口里面做好各种异常数据的判断。于是增加判断以后的代码变得复杂了:

@app.route('/insert', methods=['POST'])
def insert():info = request.jsonname = info.get('name', '')ifnot name:return {'success': False, 'msg': 'name 参数不可省略,不可为空!'}age = info.get('age', 0)ifnot isinstance(age, int):return {'success': False, 'msg': 'age参数不是数字!'}age_after_10_years = age + 10msg = f'此人名叫:{name},10年后,此人年龄:{age_after_10_years}'return {'success': True, 'msg': msg}

看来,用 Flask,虽然能让你用很短的代码写出一个能工作的项目。但要写成一个可以正常使用的项目,还是需要你自己写更多代码。

下面我们来看一下,现代化的 web 框架:FastApi能把这个工程简化到什么程度:

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class People(BaseModel):name: strage: intaddress: strsalary: float@app.post('/insert')
def insert(people: People):age_after_10_years = people.age + 10msg = f'此人名字叫做:{people.name},十年后此人年龄:{age_after_10_years}'return {'success': True, 'msg': msg}

我们还是使用 requests 发一条信息给 FastApi 开发的 HTTP 接口。对于正常数据,正常使用:

现在我们把age字段改成字符串:

返回友好的提示信息,告诉我类型错误:age 字段不是 integer

我们再试一试把name字段去掉:

返回友好信息,提示值错误:name字段丢失

整个过程中,对类型的检查全都由 FastApi 自己完成。我们省下来很多时间。

我用了 Flask 四年,但在使用了 5 分钟 FastApi 以后,我决定以后不再使用 Flask 了。

回过头来,我们好好介绍一下 FastApi。

使用pip或者pipenv即可安装 FastApi:

pip install fastapi
pipenv install fastapi

安装完成以后,我们来完成第一个 API:

from fastapi import FastAPIapp = FastAPI()@app.get('/')
def index():return {'message': '你已经正确创建 FastApi 服务!'}

这里的写法跟 Flask 几乎一致。只不过在 Flask 中,我们定义路由的装饰器为@app.route('/')。而这里写为@app.get('/')

写好代码以后,我们需要使用uvicorn来运行 FastApi。首先使用pip或者pipenv安装uvicorn

pip install uvicorn
pipenv install uvicorn

然后执行命令:

uvicorn main:app --reload

其中main表示我们的代码文件为main.pyapp表示我们初始化的 FastApi 对象的名字。--reload参数表示在修改了代码以后立即生效,不需要重启。

运行命令以后,我们访问http://127.0.0.1:8000可以看到接口已经正确返回了 JSON 格式的数据:

那么如何定义一个带参数的 GET 方法呢?我们再写一段代码:

@app.get('/query/{uid}')
def query(uid):msg = f'你查询的 uid 为:{uid}'return {'success': True, 'msg': msg}

写好代码以后,我们直接在浏览器里面访问新的地址,可以看到修改已经生效了,如下图所示:

如果想限定 uid 只能是数字,不能是字符串怎么办呢?你只需要多加 4 个字符

@app.get('/query/{uid}')
def query(uid: int):msg = f'你查询的 uid 为:{uid}'return {'success': True, 'msg': msg}

对函数query的参数使用类型标注,标注为 int 类型。现在我们再来访问一下接口:

当 query 后面的参数不是整数时,正常报错了。

我们再来看一下本文一开始的 POST 方法。在使用 Flask 的时候,我们需要手动验证用户 POST 提交上来的数据是什么格式的,字段对不对。

但使用 FastApi 的时候,我们只需要类型标注就能解决所有问题。首先我们导入from pydantic import BaseModel,然后继承BaseModel实现我们允许 POST 方法提交上来的数据字段和格式:

from pydantic import BaseModelapp = FastAPI()class People(BaseModel):name: strage: intaddress: strsalary: float

People这个类通过类型标注,指定了它里面的 4 个字段和他们的类型。现在,我们来实现 POST 方法:

@app.post('/insert')
def insert(people: People):age_after_10_years = people.age + 10msg = f'此人名字叫做:{people.name},十年后此人年龄:{age_after_10_years}'return {'success': True, 'msg': msg}

insert函数的参数people通过类型标注指定为People类型。

当我们使用 POST 方式提交数据时,FastApi 自动会以People中定义的字段为基准来校验数据,发现不对就返回报错信息。

除了开发接口变得非常简单外,FastApi 还会自动帮我们生成接口文档。大家访问http://127.0.0.1:8000/docs,可以看到接口文档已经自动生成好了:

这个接口不仅能看,而且直接就能在接口页面修改样例数据,发送请求,现场测试:

以上是对 FastApi 的极简介绍。有兴趣的同学可以查阅它的官方文档。

最后,告诉大家,FastApi 是一个异步 Web 框架,它的速度非常非常非常快。远远超过 Flask。

FastApi 是最快的几个 Web 框架之一。速度可以匹敌 Golang 写的接口。详细的对比可以看:https://www.techempower.com/benchmarks/#p=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7

推荐阅读

1

精品连载丨安卓 App 逆向课程一之环境配置

2

GitHub 热榜:一款居家旅行必备的看片神器!

3

教你轻松截获 Selenium 中的 Ajax 数据

4‍‍

如何用一条命令将网页转成电脑 App

好文和朋友一起看~

这篇关于用它 5 分钟以后,我放弃用了四年的 Flask的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991944

相关文章

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

以后写代码都是AI自动写了,Cursor+Claude-3.5-Sonnet,Karpathy 点赞的 AI 代码神器。如何使用详细教程

Cursor 情况简介 AI 大神 Andrej Karpathy 都被震惊了!他最近在试用 VS Code Cursor +Claude Sonnet 3.5,结果发现这玩意儿比 GitHub Copilot 还好用! Cursor 在短短时间内迅速成为程序员群体的顶流神器,其背后的原因在于其默认使用 OpenAI 投资的 Claude-3.5-Sonnet 模型,这一举动不仅改变了代码生成

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类class User(UserMixin):def __init__(self, id):self.id = id@app.route('/login')def login():# 模拟用户登录过程user

JobScheduler 调用导致的运行时长30分钟的功耗问题

一、SDK 的使用情况与功耗影响 案例是否导致功耗变大onStartJob return true 且子线程没有调用jobFinished()告知系统功耗变大,最长带来30分钟的partial wakelock 长持锁onStartJob return true 且子线程调用jobFinished()告知系统功耗有影响,主要线程执行时长,标准是30秒内onStartJob return fals

【超简单】1分钟解决ppt全文字体一键设置

省流 ppt的全部字体需要在“幻灯片母版”里面,“自定义字体”去设置好标题与正文的字体之后才算全部设置完毕 “视图”---“幻灯片母版” 找到“字体”---“自定义字体” 设置好中文和西文的字体,都可以按照自己的选择来,保存即可 吐槽 之所以发这么一个基础的帖子是因为,之前全网到处搜都没看到成功设置了的,其实才发现在自定义里面得多一步这个才可以,还好早发现了,希望能

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

之后是缠缠绵绵的四年恋爱

他和她初次相见是在操场上。她忽然来例假,染红了白裙子,却浑然不觉,还在和同学说笑。他看见后脸红了,脱下自己的上衣让她围在腰间。那一刻,是她一辈子也难忘的。     之后是缠缠绵绵的四年恋爱,她试图帮他,而他不肯;男人哪会用女孩子帮忙?     毕业时,他们本来免不了天各一方,但她死心塌地地跟着他走。家里人反对,几乎与她反目,她却认定这男人是她想要的。     她

[vue小白]npm run运行以后无法关闭

开启vue任务后,关闭git bash窗口发现端口仍然被占用,程序没有关闭 通过查询资料,大部分都说ctrl+c就可以了,但是经过实践发现并不可行,目测大部分都是复制粘贴的答案。 经过尝试,最终发现可能只能暴力关闭了 1.在cmd中输入netstat -ano查询占用端口号的pid 2. 然后在任务管理器中查询对应的任务并关闭 3. 在linux系统中更简单,直接kill -9 pid即可

青云QingCloud SD-WAN 助你分钟级构建企业专属智能广域网络

广域网接入,多地组网,分支机构、数据中心与云端的高速互联已成为保证企业业务与经营活动全程在线的必备条件。 但这也往往意味着复杂漫长的专线网络部署,昂贵的价格,访问速度不可控,缺乏弹性……是不是听起来就头疼? 你需要的是一个跨时代的新服务,一键解决上述痛点。这就是今天要介绍的青云QingCloud SD-WAN 云网一体智能组网服务。 相比传统方案,该服务可帮助用户零部署接入动态多线 BG

【anaconda 环境搭建】环境搭建python快速30分钟

1、下载anaconda https://repo.anaconda.com/archive/index.html 选择下载 Anaconda3-2019.10-Linux-x86_64.sh 2、安装linux 工具4个,上传,下载,解压,打包 yum install zip yum install unzip yum install lrzsz Yum install wget 3、r