Python:Flask请求参数和响应探究
【摘要】 一、参数传递
测试代码
# -*- coding: utf-8 -*-
from flask import Flask, request
app = Flask(__name__)
@app.route("/", methods=['POST', 'GET'])
def index(): print(request.args) print(request.f...
一、参数传递
测试代码
# -*- coding: utf-8 -*-
from flask import Flask, request
app = Flask(__name__)
@app.route("/", methods=['POST', 'GET'])
def index(): print(request.args) print(request.form) print(request.values) print(request.data) print(request.json) return "ok"
if __name__ == '__main__': app.run(debug=True)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
请求测试
1、发送json数据
POST http://127.0.0.1:5000/?age=12
Content-Type: application/json
{
"name": "Tom"
}
- 1
- 2
- 3
- 4
- 5
- 6
收到的数据如下
request.args [('age', '12')]
request.form []
request.values [('age', '12')]
request.data b'{\n"name": "Tom"\n}'
request.json {'name': 'Tom'}
- 1
- 2
- 3
- 4
- 5
2、发送form数据
POST http://127.0.0.1:5000/?age=12
Content-Type: application/x-www-form-urlencoded
name=Tom
- 1
- 2
- 3
- 4
收到的数据如下
request.args [('age', '12')]
request.form [('name', 'Tom')]
request.values [('age', '12'), ('name', 'Tom')]
request.data b''
request.json None
- 1
- 2
- 3
- 4
- 5
如果request.args
和 request.form
数据相同,会优先取request.args
中的数据
二、升级参数接收
通过测试发现,如果前端没有传递正确的json数据,request.json
会返回一个None
,如果直接取数据会报错,目前主流的传参方式是json数据,我们改装一下:
# -*- coding: utf-8 -*-
from flask import Flask, request, Request
class MyRequest(Request): @property def json(self): """避免json数据未传递而返回 None""" try: data = self.get_json() except Exception as e: data = None return data or {} @property def params(self): """ 将参数全都放入一个变量 参数获取顺序 args > form > json :return: {dict} """ data = {} for key, value in self.args.items(): data.setdefault(key, value) for key, value in self.form.items(): data.setdefault(key, value) for key, value in self.json.items(): data.setdefault(key, value) return data
app = Flask(__name__)
app.request_class = MyRequest
@app.route("/", methods=['POST', 'GET'])
def index(): print(request.args) print(request.form) print(request.values) print(request.data) print(request.json) print(request.params) return request.params
if __name__ == '__main__': app.run(debug=True)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
MyRequest
类 修改了 json
方法,捕获了异常,避免返回 None
报错,添加了params
方法,将所有参数都封装到里边,简化参数获取,不过不能准确获取参数
三、返回参数
视图函数不能直接返回 list
参数,所以改造一下
# -*- coding: utf-8 -*-
from flask import Flask, request, Request, jsonify
class MyRequest(Request): @property def json(self): """避免json数据未传递而返回 None""" try: data = self.get_json() except Exception as e: data = None return data or {} @property def params(self): """ 将参数全都放入一个变量 处理参数顺序 args > form > json :return: {dict} """ data = {} for key, value in self.args.items(): data.setdefault(key, value) for key, value in self.form.items(): data.setdefault(key, value) for key, value in self.json.items(): data.setdefault(key, value) return data
class MyFlask(Flask): request_class = MyRequest def make_response(self, rv): """视图函数可以直接返回list 或者 dict""" if isinstance(rv, (list, dict)): return jsonify(rv) return super().make_response(rv) def post(self, rule, **options): """便于书写post方法""" options.setdefault('methods', ['POST']) return self.route(rule, **options)
app = MyFlask(__name__)
@app.post("/")
def index(): return ['cat', 'pig']
if __name__ == '__main__': app.run(debug=True)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
额外添加了post
方法,便于书写post请求
相关文章
文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。
原文链接:pengshiyu.blog.csdn.net/article/details/109379243
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)