Python:Flask请求参数和响应探究

举报
彭世瑜 发表于 2021/08/13 23:56:25 2021/08/13
【摘要】 一、参数传递 测试代码 # -*- 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.argsrequest.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请求

相关文章

  1. Flask最佳实践-1
  2. Flask最佳实践-2

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/109379243

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。