![4d86db02be8b46615514f44adc896cd7.png](https://i-blog.csdnimg.cn/blog_migrate/de2447f65c93d738d122ac13d3d57273.jpeg)
客户端向服务器发送数据的方式有多种,包括URL路径、URL查询字符串、请求头(headers)、请求内容(body)。
![9a7a72b0b12408bf6a0ea4583792c407.png](https://i-blog.csdnimg.cn/blog_migrate/e1d30e2a1e7d554d2f3e9e9b22eab8fe.png)
从URL路径获取
从URL路径获取参数是简单也是最常用的方法,例如:https://zhuanlan.zhihu.com/p/265499541
。服务器想要从URL中获取参数,应该写为下面的形式。
@app.route('/p/<int:paperNum>')
def article(paperNum):
...
return paperNum
这种方式一般仅用作设定动态URL,限制较多。对于GET请求方法,我们更常用的是查询字符串。
从URL查询字符串获取
查询字符串就是URL尾部?
后面的部分,例如https://www.google.com/search?q=qq
中的 ?q=qq
部分。该参数可以从request
对象中获取。
from flask import request
searchword = request.args.get('key', '')
# 或
searchword = request.args['key']
建议获取参数时使用第一种request.args.get()
方法,或者catch一下KeyError
,否则拿不到参数的话会出错,进而返回404。
从请求头header获取
获取Http请求头中的数据。
from flask import request
request.headers.get('your-header-name')
从body中获取
我在查询相关资料时,看到一种非常普遍的说法:GET请求的参数使用requests.args
获取,POST请求的参数从requests.form
获取。这种说法非常不准确,因为在HTTP协议中,无论是GET还是POST,都是有URL,Header和Body的,并不是说GET请求就不能从body中获取数据。
从请求的Body中获取参数一般这样写:
requests.form.get('key')
无论是GET方法还是POST方法,都是可以使用的,只是用户在浏览器中输入URL访问页面时,是无法在请求的body中插入数据的,所以一般情况下,我们从GET请求的查询字符串获取参数;客户端是APP或其他程序时,就没有这样的限制。
获取文件
从Body中获取文件也一样,我们在Postman的body->form-data中发送数据
![809d2977cecc35dcc228cbd44a41ebf9.png](https://i-blog.csdnimg.cn/blog_migrate/ffd216b20b7eb9a6a7ab32d74c68c586.png)
在Flask中可以这样获取:
requests.file.get('file01')
使用这样的方法可以一次上传多个文件。
从cookie获取
cookie
是服务器暂时保存在浏览器的数据,由于HTTP协议是无状态的,所以每次请求的时候浏览器都会将cookie
一起发送给服务器。所以cookie
也是从request
对象中获取。
username = request.cookies.get('username')
cookie
在浏览器中是明文存储的,想要加密存储就要使用session
,session
在其实就是加密后存储在cookie
中, 所以使用request.cookies.get('session')
就可以拿到session的密文。但是我们一般不会这样处理session
,而是使用Flask提供的session
对象。
// 导入
from flask import session
// 获取
session['username']
关于session
的更多使用方法详见官方文档。
使用Flask-Restful
为APP编写API时,常常使用Flask-Restful
扩展。Flask-Restful
提供了一个 reqparse
对象,用来帮助用户集中完成解析请求参数、处理各种异常等工作。
from flask_restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('rate', type=int, help='Rate cannot be converted')
parser.add_argument('name')
args = parser.parse_args()
不过根据Flask-Restful
的官方文档的说法,不再建议使用这种方法,并且在后续版本中不会再进行维护。
![c8409cb63d5fd5a3c9e33e2c21a4b508.png](https://i-blog.csdnimg.cn/blog_migrate/ca0a9a8441df517dadc1d4d1ff8d7939.jpeg)
所以我们使用李辉大佬在《Flask Web开发实战》中推荐的“webargs”。
使用webargs
和Flask-Restful
类似,webargs使用类似的机制来处理参数。包括了参数验证、异常处理等功能,具体使用方法我就不说了,因为官方文档写的实在太清楚了。
参考文献
https://flask.palletsprojects.com/en/1.1.x/quickstart/#accessing-request-dataflask.palletsprojects.com postman中form-data、x-www-form-urlencoded、raw、binary的区别juejin.im HTTP的GET和POST格式解析_犀牛饲养员-CSDN博客blog.csdn.net![2ebea853e03212a32ed25aaf471f962d.png](https://i-blog.csdnimg.cn/blog_migrate/b0f08d1aa0b33201048bef24658293fe.png)
![1cb7fa96ad844a7186da5b45f340c830.png](https://i-blog.csdnimg.cn/blog_migrate/4d9a762e2cd2d505b720c2209f4aee0e.jpeg)