我有一个很简单的需求:写一个HTTP接口,使用POST发送一个JSON字符串,在接口中读取发送的参数。参数被处理并返回。如果我们使用Flask来开发这个接口,那么代码是这样的:fromflaskimportFlask,requestapp=Flask(__name__)@app.route('/insert',methods=['POST'])definsert():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'])definsert():info=request.jsonname=info.get('name','')ifnotname:return{'success':False,'msg':'name参数不能省略,不能为空!'}age=info.get('age',0)ifnotisinstance(age,int):return{'success':False,'msg':'年龄参数不是数字!'}age_after_10_years=age+10msg=f'这个人的名字是:{name},10年后,这个人的年龄:{age_after_10_years}'return{'success':True,'msg':msg}用Flask,虽然它允许您使用非常短的代码编写一个工作项目。但是要写出一个可以正常使用的项目,还是需要自己多写代码。让我们看看现代Web框架:FaskApi能在多大程度上简化这个项目:fromfastapiimportFastAPIfrompydanticimportBaseModelapp=FastAPI()classPeople(BaseModel):name:strage:intaddress:strsalary:float@app.post('/insert')definsert(people:People):age_after_10_years=people.age+10msg=f'这个人的名字是:{people.name},十年后这个人的年龄:{age_after_10_years}'return{'success':True,'msg':msg}复制代码我们仍然使用requests向FastApi开发的HTTP接口发送消息。对于普通数据,正常使用:现在我们把年龄字段改成字符串:返回友好的提示信息,告诉我类型不对:年龄字段不是整数。再试一下去掉name字段:返回友好信息,提示值错误:name字段丢失。整个过程中,类型检查都是由FastApi自己完成的。我们节省了很多时间。我用了四年Flask,但是用了5分钟FastApi之后,我决定不再使用Flask。回过头来,还是好好介绍一下FastApi吧。FastApi可以使用pip或者pipenv安装:pipinstallfastapipipenvinstallfastapi复制代码安装完成后,我们来完成第一个API:fromfastapiimportFastAPIapp=FastAPI()@app.get('/')defindex():return{'message':'你已经正确创建了FastApi服务!'}复制代码这里的写法和Flask差不多。只是在Flask中,我们将路由装饰器定义为@app.route('/')。而这里写成@app.get('/')如下图所示:写完代码后,我们需要使用uvicorn来运行FastApi。首先使用pip或者pipenv安装uvicorn:pipinstalluvicornpipenvinstalluvicorn复制代码然后执行命令:uvicornmain:app--reload复制代码其中main表示我们的代码文件是main.py,app表示名字我们初始化的FastApi对象。--reload参数表示修改代码后立即生效,不需要重启。运行命令后,我们访问http://127.0.0.1:8000,可以看到接口已经正确返回了JSON格式的数据:那么如何定义带参数的GET方法呢?再写一段代码:@app.get('/query/{uid}')defquery(uid):msg=f'你查询到的uid是:{uid}'return{'success':True,'msg':msg}复制代码写好代码后,我们直接在浏览器中访问新地址,可以看到修改已经生效,如下图:如果要限制uid为只有数字而不是字符串?羊毛布?你只需要再添加4个字符:@app.get('/query/{uid}')defquery(uid:int):msg=f'你查询的uid是:{uid}'return{'success':True,'msg':msg}复制代码,在函数查询的参数上使用类型注解,标记为int类型。现在我们再访问一下这个接口:当query后面的参数不是整数时,正常报错。我们先来看看本文开头的POST方法。在使用Flask时,我们需要手动验证用户POST提交的数据的格式,以及字段是否正确。但是在使用FastApi的时候,我们只需要类型注解就可以解决所有的问题。首先我们导入frompydanticimportBaseModel,然后继承BaseModel实现我们允许POST方法提交的数据字段和格式:frompydanticimportBaseModelapp=FastAPI()classPeople(BaseModel):name:strage:intaddress:strsalary:float复制代码People类通过类型注解指定了其中的4个字段及其类型。现在,让我们实现POST方法:@app.post('/insert')definsert(people:People):age_after_10_years=people.age+10msg=f'这个人的名字是:{people.name},十年此人年龄之后:{age_after_10_years}'return{'success':True,'msg':msg}复制代码插入函数的参数people通过类型注解指定为People类型。当我们使用POST方式提交数据时,FastApi会自动根据People中定义的字段对数据进行校验,如果发现有问题则返回错误信息。FastApi除了让接口的开发变得非常简单之外,还会自动为我们生成接口文档。访问http://127.0.0.1:8000/docs可以看到已经自动生成了接口文档:这个接口不仅可以查看,还可以直接在接口页面修改示例数据,发送请求,以及进行实地测试:以上是对FastApi的最低限度的介绍。有兴趣的同学可以查看它的官方文档最后告诉大家,FastApi是一个异步web框架,速度非常非常非常快。远远超过Flask。FastApi是最快的Web框架之一。速度可以匹配Golang编写的界面。详细对比可以看:文末福利Python数据汇总&&6W字知识手册(长期更新中)可用的最快的Python框架之一
