今天先来学习一下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,就可以成功返回了,去页面,看到:

除了字符串以外,还可以返回元组,但是返回元组是有要求的,元组内容包括三个参数:responsestatus_codeheaders,其中:

  • 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返回值的更多相关文章

  1. java使用Filter过滤器对Response返回值进行修改

    转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...

  2. 转:java使用Filter过滤器对Response返回值进行修改

    练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...

  3. Java程序调用带参数的shell脚本返回值

    Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: -  \)$  Shell本身的PID(ProcessI ...

  4. Flask实战第6天:视图函数Response返回值

    视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...

  5. 6、Flask实战第6天:视图函数Response返回值

    视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...

  6. 拦截器HandlerInterceptorAdapter的postHandle和afterCompletion无法获取response返回值问题

    缘起 有一个需求,在进入controller之前验证调用次数是否超过限制,在响应之后判断是否正常返回,对调用次数进行+1,发现带@RestController的类和带@ResponseBody的方法在 ...

  7. java jsp调用shell(带参数)脚本并返回值

    test.jsp <%@ page language="java" import="java.util.List,java.util.ArrayList,java. ...

  8. controller修改response返回值

    1.responseBodyAdvice2. aop3.过滤器.拦截器

  9. 慕课网-Java入门第一季-7-5 Java 中带参无返回值方法的使用

    public class HelloWorld { public static void main(String[] args) { // 创建对象,对象名为hello HelloWorld hell ...

随机推荐

  1. JVM科普

    目录 再看前言 不完美的程序 Java发展史 JVM族谱 什么是广义的虚拟机? 什么是Java虚拟机(JVM)? 二刷周先生的<深入理解JVM>时,没想到已经出了第三版,拿着第二版的我在风 ...

  2. intel:spectre&Meltdown侧信道攻击(五)—— DRAM address mapping

    前面介绍了row hammer,理论上很完美,实际操作的时候会面临很尴尬的问题:内存存储数据最小的单位是cell(就是个电容,充电是1,放电是0),无数个横着的cell组成row,无数个竖着的cell ...

  3. 【Canal】互联网背景下有哪些数据同步需求和解决方案?看完我知道了!!

    写在前面 在当今互联网行业,尤其是现在分布式.微服务开发环境下,为了提高搜索效率,以及搜索的精准度,会大量使用Redis.Memcached等NoSQL数据库,也会使用大量的Solr.Elastics ...

  4. Maven执行Reimport命令报错:See logs for details

    Idea版本:2018.1.3 maven版本:3.6.2 Idea配置了本地下载的maven之后,不管是直接执行maven的Reimport命令,还是使用idea的Reimport按钮,都会报这个错 ...

  5. 记录一次jmeter脚本开发缺少utf-8惹的祸

    背景:需要模拟余额发放,并进行大批量的发放,我就想到了jmeter.就是几个简单的接口,我想很简单,就上手,没想到最后鸡鸡,害我查了半天原因. 操作:我编写的脚本: 请求默认值的内容编码我也是为空,当 ...

  6. Web优化躬行记(3)——图像和网络

    一.图像 1)响应式图像 浏览器根据屏幕大小.设备像素比.横竖屏自动加载合适的图像. 响应式的功能可以通过srcset和sizes两个新属性实现. 前者可指定选择的图像以及其大小,后者会定义一组媒体条 ...

  7. java数组输出的三种方式

    第一种:foreach语句遍历输出 //通过foreach语句遍历输出数组 int nums[] = new int [4]; for (int num:nums) { System.out.prin ...

  8. OAuth2.0-1

    分布式授权解决方案: 其中授权服务一般放在网关服务上,资源服务指的是,挂在网关下得各个微服务 网关授权客户端>客户端拿到token>客户端拿到token到网关验证,获取token明文> ...

  9. 极简 Node.js 入门 - Node.js 是什么、性能有优势?

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  10. 001_go语言中的hello world

    代码演示: package main import "fmt" func main() { fmt.Println("hello world") } 代码解读: ...