flask cookies_第九问 · Flask如何优雅的获取客户端请求数据?

4d86db02be8b46615514f44adc896cd7.png

客户端向服务器发送数据的方式有多种,包括URL路径、URL查询字符串、请求头(headers)、请求内容(body)。

9a7a72b0b12408bf6a0ea4583792c407.png
Postman截图

从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
Postman上传文件

在Flask中可以这样获取:

requests.file.get('file01')

使用这样的方法可以一次上传多个文件。

从cookie获取

cookie是服务器暂时保存在浏览器的数据,由于HTTP协议是无状态的,所以每次请求的时候浏览器都会将cookie一起发送给服务器。所以cookie也是从request对象中获取。

username = request.cookies.get('username')

cookie在浏览器中是明文存储的,想要加密存储就要使用sessionsession在其实就是加密后存储在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
官网警告

所以我们使用李辉大佬在《Flask Web开发实战》中推荐的“webargs”。

使用webargs

Flask-Restful类似,webargs使用类似的机制来处理参数。包括了参数验证、异常处理等功能,具体使用方法我就不说了,因为官方文档写的实在太清楚了。

参考文献

https://flask.palletsprojects.com/en/1.1.x/quickstart/#accessing-request-data​flask.palletsprojects.com postman中form-data、x-www-form-urlencoded、raw、binary的区别​juejin.im HTTP的GET和POST格式解析_犀牛饲养员-CSDN博客​blog.csdn.net
2ebea853e03212a32ed25aaf471f962d.png
Request Parsing - Flask-RESTful 0.3.8 documentation​flask-restful.readthedocs.io Quickstart - Flask Documentation (1.1.x)​flask.palletsprojects.com
1cb7fa96ad844a7186da5b45f340c830.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值