Flask API
给大家分享一下flask api
和 Flask-RESTful API 的两种不同用法。。首先API只会返回json的类型,不会返回HTML。API一般适用于前后端分离的情况。Flask API的实现方式有两种。第一种就是不用flask_restplus
。第二种是用flask_restplus
。首先给大家说一下不用flask_restplus
怎么写。
不使用 flask_restplus
在不适用flask_restplus
的情况下我们可以直接使用route的形式来写API。只是把return render_template
改成了return jsonify
来返回一个json类型的数据。可以根据不同的request的方式(GET, POST, DELETE)可以处理不同的事情,比如DELETE可以用来删除数据, POST可以添加数据,GET可以获取数据。具体实现方法如下:
1 | from flask import Flask, request, jsonify |
GET 请求测试如下:
1 | curl -X GET "http://127.0.0.1:5000/index?username=admin" -H "accept: application/json" |
结果如下:
1 | { |
POST 请求测试如下
1 | curl -X POST "http://127.0.0.1:5000/index?username=admin" -H "accept: application/json" |
结果如下:
1 | { |
DELETE 请求测试如下
1 | curl -X DELETE "http://127.0.0.1:5000/index?username=admin" -H "accept: application/json" |
结果如下:
1 | { |
使用flask_restplus
Flask-RESTful 提供了 reqparse 一种类似 argparse 参数解析机制以简化参数处理。所以处理请求数据的时候和Flask不太一样。parser = reqparse.RequestParser():
reqparse使用RequestParser() 可以从 flask.Request.values,以及 flask.Request.json 解析值。这里创建了一个解析对象parser。parser.add_argument('task'):
向parser对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项。parser.parse_args():
调用parse_args()方法进行解析,解析成功之后即可使用。POST, GET, DELETE
获取参数的方式一样。在定义API的时候可以是用@api.param
添加参数,在web端测试的时候比较方便。@app.doc(description='xx')
添加对这个API的描述。@app.response(200,'success')
定义路由code的信息,普遍是用的是200,404,400,403等等。
我发现最近flask的版本稳定性很差,尤其是werkzeug
和flask之间的版本冲突,大家最好用虚拟机进行测试实验比较好。。。
1 | from flask import Flask, jsonify, make_response, request |
GET 请求测试:
API的请求方法和flask不太一样,需要 -d 加上参数
, POST请求也是一样
1 | curl -X GET "http://127.0.0.1:5000/login" -H "accept: application/json" -d "username=admin" |
请求结果:
1 | { |
POST 请求测试:
1 | curl -X POST "http://127.0.0.1:5000/login" -H "accept: application/json" -d "username=admin" |
请求结果:
1 | { |
给大家看一下abort
的显示结果:
1 | { |
或者大家可以直接打开http://127.0.0.1:5000
可以显示界面来测试。 如下图所示:
前端请求API
昨天写的太晚就先睡了,今天给补上怎么用AJAX
也就是前端来请求API数据的。大家可以自行了解一下AJAX
的function什么的,demo用的是JQuery
中的AJAX
。因为牵涉到了跨域请求,所以后端也稍微有一点改变。需要用到flask_cors
来解决这个问题。只需要在上面的Python代码加两行代码就OK了。
1 | from flask_cors import CORS |
如果不加CROS(app)
的话会在浏览器的调试Console
出现以下报错:
1 | Access to XMLHttpRequest at 'http://127.0.0.1:5000/login?username=admi' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. |
前端代码具体实现如下:
1 | <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> |
拓展
当我们有多个api
功能需要实现,比如登录,注册等等。为了更好的区分每个功能之间的url,我们可以使用api.namespace()
对不同功能创建不同的变量。比如我们需要实现注册,登录(验证模块)时我们可以使用auth = api.namespace('auth', description="Authentication Services")
。同时为了能更加方便的在api提供的接口里面进行测试,我们可以对每个method进行声明response
,param
或者doc
等等。比如:
1 | from flask import Flask, jsonify, make_response, request |
为了方便使用,我创造了一个公开的轻量级API模板