2个案例带你快速实现Response返回值
今天先来学习一下Response
的相关知识。
所有返回前台的内容其实都应该是Response
的对象或者其子类,我们看到如果返回的是字符串直接可以写成return u'字符串内容'
的形式,但是其实这个字符串也是经过了Response
包装的:returnResponse(u'字符串')
我们看一段代码:
# coding: utf-8from flask import Flask, Response app = Flask(__name__) # type: Flaskapp.debug = True@app.route('/')def hello_world():
return 'Hello World!'@app.route('/login/')def login():
return Response(u'login')if __name__ == '__main__':
app.run()
代码里我新建了一个login
函数,返回的就是用Response
包装后的字符串,访问地址可以看到页面打印了login
。
我们有时候需要返回数组、字典之类的数据,但是数组或者字典这些数据是不能直接return
的。这个时候怎么办呢?答案就是你必须将数组或字典转换成json
后再返回(这就是为什么我们做接口测试的时候传参前用json.loads()
将字符串转换成字典的原因了),因为json
就是一个字符串。
数组或字典转换成json
的函数叫做jsonify
,你需要先导入from flask import jsonify
或者像下面代码里写的那样,一下子导入好几个库:
# coding: utf-8from flask import Flask, Response, jsonify app = Flask(__name__) # type: Flaskapp.debug = True@app.route('/')def hello_world():
return 'Hello World!'@app.route('/login/')def login():
dict1 = {"name": "Warren"} return jsonify(dict1)if __name__ == '__main__':
app.run()
上面代码里dict1
的数据类型是一个字典,我们通过jsonify()
将其转换成了json
,就可以成功返回了,去页面,看到:
除了字符串以外,还可以返回元组
,但是返回元组是有要求的,元组内容包括三个参数:response
、status_code
、headers
,其中:
response
指页面打印信息,可以是字符串或Response
对象status_code
指状态码,成功200
,找不到页面404
等等headers
指信息头
# coding: utf-8from flask import Flask, Response, jsonify app = Flask(__name__) # type: Flaskapp.debug = True@app.route('/')def hello_world():
return 'Hello World!'@app.route('/login/')def login():
dict1 = {"name": "Warren"} return jsonify(dict1)@app.route('/set/')def myset(): return u'返回元组', 200, {"name": "Warren"}if __name__ == '__main__':
app.run()
看上面代码的myset
函数,我return
了一个元组(单个值的元组可以不写括号,而且如果你加上括号,pycharm会有黄线提醒你remove redundant parentheless
,意思就是去掉多余的括号)。然后我们到页面访问/set/
这个页面,打开F12就是开发者工具,然后刷新页面:
然后看开发者工具:
接下来介绍自定义返回对象:
现在我们假定有一个需求:所有的视图函数都要返回json格式的对象
我们先看一下Response
的源码:
发现只有一行default_mimetype='text/html'
,所以我们需要重写Response
类;当然我们需要知道常用的数据类型:
text/html(默认的,html文件)
text/plain(纯文本)
text/css(css文件)
text/javascript(js文件)
application/x-www-form-urlencoded(普通的表单提交)
multipart/form-data(文件提交)
application/json(json传输)
application/xml(xml文件)
如果对软件测试、接口测试、自动化测试、面试经验交流。感兴趣可以加软件测试交流:1085991341,还会有同行一起技术交流。
# coding: utf-8from flask import Flask, Response, jsonify app = Flask(__name__) # type: Flaskapp.debug = True@app.route('/')def hello_world():
return 'Hello World!'@app.route('/login/')def login():
dict1 = {"name": "Warren"} return jsonify(dict1) @app.route('/set/')def myset(): return u'返回元组', 200, {"name": "Warren"}class JSONResponse(Response): default_mimetype = 'application/json' @classmethod
def force_type(cls, response, environ=None):
if isinstance(response, dict):
response = jsonify(response) return super(JSONResponse, cls).force_type(response, environ)# 这个方法也需要注册app.response_class = JSONResponse@app.route('/jsontext/')def jsontext():
return {"name": "Warren"}if __name__ == '__main__':
app.run()
代码说明,以上代码重写了force_type
方法,那么什么时候代码会调用force_type
方法呢?如果返回的字符串不符合下面三种数据类型,就会调用该方法,这三种数据类型是字符串
、元组
、response
。
上面代码里jsontext
函数直接返回dict
类型数据,本来是不可以的,但是因为我们重写了force_type
方法,现在这个函数就可以直接返回这个数据了:
以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。
2个案例带你快速实现Response返回值的更多相关文章
- java使用Filter过滤器对Response返回值进行修改
转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...
- 转:java使用Filter过滤器对Response返回值进行修改
练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...
- Java程序调用带参数的shell脚本返回值
Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: - \)$ Shell本身的PID(ProcessI ...
- Flask实战第6天:视图函数Response返回值
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...
- 6、Flask实战第6天:视图函数Response返回值
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...
- 拦截器HandlerInterceptorAdapter的postHandle和afterCompletion无法获取response返回值问题
缘起 有一个需求,在进入controller之前验证调用次数是否超过限制,在响应之后判断是否正常返回,对调用次数进行+1,发现带@RestController的类和带@ResponseBody的方法在 ...
- java jsp调用shell(带参数)脚本并返回值
test.jsp <%@ page language="java" import="java.util.List,java.util.ArrayList,java. ...
- controller修改response返回值
1.responseBodyAdvice2. aop3.过滤器.拦截器
- 慕课网-Java入门第一季-7-5 Java 中带参无返回值方法的使用
public class HelloWorld { public static void main(String[] args) { // 创建对象,对象名为hello HelloWorld hell ...
随机推荐
- SpringXMl文件不提示的解决方法
applicationContext.xml没有提示的解决方法 1.配置spring-beans-4.1.xsd文件 (1)找到spring-beans-4.1.xsd的文件的位置,例如: (2)复制 ...
- 企业玩转DevOps转型:由弱到强,只需7步
[摘要] 在参考业界方法并总结客户成功故事的基础上,本文提出了“七步法”路线图,希望能帮助更多的企业顺利进行DevOps转型. 从2009年诞生,DevOps已经悄然走过了10多个年头.Gartner ...
- opencv图片缩放与镜像
一个练习的代码,先对图片进行缩放,然后再做镜像: import cv2 import numpy as np img = cv2.imread("src.jpg", 1) cv2. ...
- 2019.12.9Java课堂总结
今天在课堂上进行了练习.现进行成果及不足汇报: 1.完成了登录界面的设计 2.完成了数据库的连接. 3.完成了数据库表的设计 4.完成了变量的定义与初始化以及get.set的设立. 5.对整体框架 ...
- ROS 八叉树地图构建 - 安装 octomap 和 octomap_server 建图包!
项目要用到八叉树库 Octomap 来构建地图,这里记录下安装.可视化,并启用带颜色的 Octomap 的过程. 一.Apt 安装 Octomap 库 如果你不需要修改源码,可以直接安装编译好的 oc ...
- java Struts 多种表单写法
1.html:form(struts标签) 缺点:必须指定一个有效的action属性. 优点:可以使用struts token机制. 调用方法通过submit的name属性. <table al ...
- Win10系统Jmeter+maven+Jenkins接口自动化环境搭建(一)
Jmeter+maven+Jenkins实现接口自动化,需要使用idea或eclipse配置maven项目,这里我使用的是idea.具体步骤如下: 1.安装jmeter+jdk jmeter安装之前需 ...
- CSS 定位总结
目录 元素显示模式 元素模式 元素显示模式转换 CSS定位机制 静态定位static 相对定位relative 绝对定位absolute 固定定位fixed 粘性定位sticky 定位小结一图流 CS ...
- IDEA 非常重要的一些设置项 → 一连串的问题差点让我重新用回 Eclipse !
开心一刻 建筑行业内,我看过的最凶残笑话(IT行业内好一致!) 上联:一天晚上两个甲方三更半夜四处催图只好周五加班到周六早上七点画好八点传完九点上床睡觉十分痛苦 下联:十点才过九分甲方八个短信七个电话 ...
- Unity3D制作类似吃鸡的小地图
先看效果图: 实现的效果就是右上角的一个小地图,会随着人物的移动而移动,显示人物的方向,并且可以展示地图设定范围的其他的玩家 制作起来也很简单,不需要任何代码.主要原理就是先创建Render Text ...