flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask

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

928529a9aafcab72e354ca522db5e356.png

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

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

from flask import Flask, request

app = Flask(__name__)


@app.route('/insert', methods=['POST'])
def insert():
    info = request.json
    name = info['name']
    age = info['age']
    age_after_10_years = age + 10
    msg = 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.json
    name = 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 + 10
    msg = f'此人名叫:{name},10年后,此人年龄:{age_after_10_years}'
    return {'success': True, 'msg': msg}

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

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

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class People(BaseModel):
    name: str
    age: int
    address: str
    salary: float

@app.post('/insert')
def insert(people: People):
    age_after_10_years = people.age + 10
    msg = 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 FastAPI

app = 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 BaseModel

app = FastAPI()


class People(BaseModel):
    name: str
    age: int
    address: str
    salary: float

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

@app.post('/insert')
def insert(people: People):
    age_after_10_years = people.age + 10
    msg = 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。

6456f960cbc3a0ec68b4428857430eca.png

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

推荐阅读

1

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

2

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

3

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

4‍‍

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

好文和朋友一起看~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

傲梦python笔试题_python笔试题

冒泡排序的原理:每次对相邻的两个元素进行比较,若前者大于后者,这将两者的位置交换。第一轮就可以将最大的元素置于列表的最后。几轮循环 冒泡排序的前提条件:有序的列表 import unittest # 冒泡排序 def bubble_sort(arr): for i…

python pexpect pxssh scp_python Pexpect 实现输密码 scp 拷贝的方法

在服务器A上的程序用到服务器B上的文件data,并且需要定期更新文件。 但是直接在bash文件中使用scp -P 1000 192.168.199.10:/temp/data /temp由于权限限制,不能免ssh密码拷贝,会要求输入B机器的密码。本想直接在bash文件中使用Pexpect 来实现…

python的类方法_python 类不实例化,调用类方法:@staticmethod 和 @classmethod

staticmethod 和 classmethod 用法 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 而使用staticmethod或classmethod,就可以不需要实例化,直接类名.方法名()来调用。 这有利于组织代码,把某些应该属于…

android sse 人脸识别,基于Android Camera2之openCamera 流程

简介frameworks\base\core\java\android\hardware\camera2Camera2在Android 5.0上首次出现,主要重新定义了一套Camera 的使用接口API,设计思想出现了变化,具体的可自行搜索,此处主要介绍下Camera2的常见类以及使用流程。CameraCap…

fetch 不是xhr_春招|前端2019应届春招:不是被大厂选,而是选大厂(字节跳动,美团,网易)...

作者:Thescavenger链接:https://www.nowcoder.com/discuss/163165来源:牛客网你需要的前端面经个人情况本科,成都双非大学,大三开始正式学习前端,主攻 react,目前大四。已拿美团、字节跳动 offe…

vscode编辑python_VSCode+Python开发环境

准备开始转向用VSCode做开发,所以把一些常用的开发环境转移到VSCode上。 这次搭建的是Python3的开发环境。 其他相关博文: 一、测试环境 Windows 10 VSCode v1.11.1 Python v3.6.1 二、安装Visual Studio Code 三、安装Python这一步,记得…

多帧点云数据拼接合并_PCL点云处理实践(二):点云的处理和拼接

滤除背景我们获得的点云可能包含一部分背景的点云。要去除背景&#xff0c;只保留人体信息&#xff0c;最简单的方式是使用直通滤波器滤除较远点。这部分代码如下&#xff1a;123456pcl::PassThrough<:pointxyz>pass; //设置滤波器对象pass.setInputCloud(cloud); //设置…

html5 css3浏览器,五大主流浏览器CSS3和HTML5兼容性大比拼

五大主流浏览器CSS3和HTML5兼容性大比拼出处&#xff1a;快科技 2011-05-26 16:15:42 编辑&#xff1a;萧萧[爆料] 收藏文章各大主流浏览器对CSS3和HTML5的支持越来越完善&#xff0c;曾经让多少前端开发人员心碎的IE系也开始拥抱标准。就在前几天&#xff0c;W3C的HTML5社…

自学python 编程基础知识_python学习-基础知识-1

1、计算机历史 计算机使用高低电压的两种状态来描述信息。计算机可以理解的只有二进制数据即010100011....&#xff0c;1个比特位可以表示的状态只有2种&#xff0c;n个比特位可以表示的状态有2的n次方种。 所以如果想要描述天气状态&#xff1a;天晴、下雨、刮风、下雪、霜冻&…

comparator 字符串比较大小_Java中Comparable和Comparator实现对象比较

当需要排序的集合或数组不是单纯的数字型时&#xff0c;通常可以使用Comparator或Comparable&#xff0c;以简单的方式实现对象排序或自定义排序。A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort…

html中属性的作用,html的标签中 unselectable=on 属性的作用

在IE浏览器中&#xff0c;当input获得焦点时&#xff0c;点击有unselectable"on"属性的标签时&#xff0c;不会触发onblur事件。加上该属性的元素不能被选中。< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">< html>< h…

一个控制器怎么转发到另外一个控制器_楼宇自动化系统(BAS),DDC,一个最核心的控制器...

楼宇自动化系统(BAS)&#xff0c;一个熟悉又陌生的系统楼宇自控系统(BAS系统)设有一个中央监控中心&#xff0c;系统配置一个或多个网络控制器&#xff0c;由多条总线或计算机网络将各种功能的控制器与中央工作站相连&#xff0c;完成对空调、给排水、通风、电梯等子系统的监控…

秒表计时器怎么读_秒表怎么读数

展开全部秒表的大圈为秒&#xff0c;小圈为分。若大圈是30分格(顶上写的是30&#xff0c;可能有60格&#xff0c;表明精度到半秒)&#xff0c;小圈里62616964757a686964616fe59b9ee7ad9431333431366239一分钟就分为两小格&#xff0c;读完整的几分&#xff0c;若过了一小格&…

html封装windows,windows 系统封装,打造一份属于自己的系统!

在电脑的使用过程中&#xff0c;由于我们每个人的使用习惯和使用方式不同&#xff0c;所以我们都会对Windows系统进行自己的设置&#xff0c;尤其是一些搞数码软件的&#xff0c;如果不小心系统坏了&#xff0c;重装系统后&#xff0c;还得一一去进行重新设置&#xff0c;非常麻…

daoi php_聊聊这些年用过的AOI

外面下着雨&#xff0c;我在家里宅&#xff0c;听着歌喝着去年的茶&#xff0c;无聊的很&#xff0c;开个话题聊下这些年用过的AOI。某年进入AOI这行&#xff0c;我的很多老同事都早已转行了&#xff0c;由于我没什么过人之处&#xff0c;只会死干&#xff0c; 现在还在做AOI。…

python语言例子_【Python】SimPy的使用示例-Go语言中文社区

使用SimPY进行离散事件仿真 SimPY是一个Python下的第三方库&#xff0c;可以方便的进行离散事件的仿真。仿真速度比较快。下面记录一下我的一点心得&#xff0c;不保证完全正确&#xff0c;供参考。 安装 $ pip install -U simpy pycharm可以再File | Settings | Project: Simu…

所有的图放到一个html,拖放是HTML5标准的组成部分,若想要把drag1图片放入d

dataTransfer 对象主要有两个方法&#xff1a;getData() 和 setData()&#xff0c;用来取值和保存值。setData() 方法的第一个参数&#xff0c;也是 getData() 方法唯一的一个参数&#xff0c;是一个字符串&#xff0c;表示保存的数据类型。IE只定义了"text" 或 &quo…

vue变量传值_VUE 学习——父组件传值给子组件

在我们编写前端代码时&#xff0c;经常遇到的一种场景&#xff0c;子组件需要使用父组件的值&#xff0c;这种情况下&#xff0c;我们可以使用props帮助我们进行父子组件间的通信。这里我们先模拟一个场景&#xff0c;展示如何使用。场景&#xff1a;在父组件修改值&#xff0c…

matlab 最小二乘法拟合_Scripy实现最小二乘法与股票K线回归

python的Scripy提供了丰富的数学工具&#xff0c;python的科学计算包scipy的里面提供了一个函数&#xff0c;可以求出任意的想要拟合的函数的参数。那就是scipy.optimize包里面的leastsq函数。函数原型是&#xff1a;leastsq(func, x0, args(), DfunNone, full_output0, col_de…

html 调高德地图 导航,在H5页面内通过地址调起高德地图实现导航

项目中用到的一个功能是要通过点击地址来实现打开地图app实现地址导航。如下图&#xff1a;实现思路就是在H5页面内通过点击marker图标然后进行当前位置与页面上地址的路程规划与导航。由于项目中用到的是高德地图&#xff0c;所以这里用到的是调起高德地图APP来实现该功能。首…