flask 返回json_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,就可以成功返回了,去页面,看到:

c538418e59b93f997bddd0682255c63d.png

除了字符串以外,还可以返回元组,但是返回元组是有要求的,元组内容包括三个参数: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就是开发者工具,然后刷新页面:

917ada3b95ae1f07d9e4e5fb5bcad072.png

然后看开发者工具:

6de7a13cef204b70d1d71af7abc71f09.png

接下来介绍自定义返回对象:

现在我们假定有一个需求:所有的视图函数都要返回json格式的对象
我们先看一下Response的源码:

148902a4ea98d68caef6e05f091e0fbf.png

发现只有一行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方法,现在这个函数就可以直接返回这个数据了:

5a50f0c64a86e3af0bd3ea49033c075e.png

以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值