今天先来学习一下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返回值的更多相关文章

  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. PHP password_needs_rehash() 函数

    password_hash() 函数用于检测散列值是否匹配指定的选项. PHP 版本要求: PHP 5 >= 5.5.0, PHP 7高佣联盟 www.cgewang.com 语法 bool p ...

  2. PHP xml_parser_create_ns() 函数

    定义和用法 xml_parser_create_ns() 函数创建带有命名空间支持的 XML 解析器.高佣联盟 www.cgewang.com 如果成功,该函数则返回可被其它 XML 函数使用的资源句 ...

  3. 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树

    很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...

  4. springboot 使用DruidDataSource 数据源

    一.添加依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</art ...

  5. 【java提高】(19)---BigDecimal详解和精度问题

    BigDecimal详解和精度问题 一.背景 在实际开发中,对于 不需要任何准确计算精度的属性可以直接使用float或double,但是如果需要精确计算结果,则必须使用BigDecimal,例如价格. ...

  6. JavaScript异步编程——Async/Await vs Promise

    兼容性 提醒一下各位,Node 现在从版本 7.6 开始就支持 async/await 了.而就在前几天,Node 8已经正式发布了,你可以放心地使用它. 如果你还没有试过它,这里有一堆带有示例的理由 ...

  7. Hotspot GC研发工程师也许漏掉了一块逻辑

    本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 今天要说的这个问题,是我经常面试问的一个问题,只是和我之前排查过的场景有些区别,属于另外一种情况.也许我这里讲了这个之后,会成为不 ...

  8. LinuX操作系统基础------>软件的安装方式,chmod权限,vi编辑器的使用

    RPM包管理 -rpm命令管理 RPM包管理 -yum在线管理 文件权限管理 vi编辑器的使用和常用的快捷键 1.RPM包管理: 一种用于互联网下载包的打包及安装工具,RPM包管理分为rpm命令管理和 ...

  9. 微信商户H5支付申请不通过被驳回,拒绝原因提示:网站存在不实内容或不安全信息

    一.H5支付简介及使用场景说明 H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付.主要用于触屏版的手机浏览器请求微信支付 ...

  10. [leetcode/lintcode 题解] Google面试题:合法组合

    给一个单词s,和一个字符串集合str.这个单词每次去掉一个字母,直到剩下最后一个字母.求验证是否存在一种删除的顺序,这个顺序下所有的单词都在str中.例如单词是’abc’,字符串集合是{‘a’,’ab ...