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

Posted xinbaby2358

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask实战第6天:视图函数Response返回值相关的知识,希望对你有一定的参考价值。

视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下:

如果返回的是一个合法的响应对象,则直接返回

可以使用make_response函数来创建Response对象,这个方法可以设置额外的数据,比如cookie、header信息等

rom flask import Flask
from flask import make_response

app=Flask(__name__)


@app.route(‘/about/‘)
def about():
    return make_response(‘about page‘)

如果返回的是一个字符串,那么Flask会重新创建一个werkzeug.wrappers.Response对象,Response将该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象

@app.route(‘/about/‘)
def about():
    return ‘about page‘
from werkzeug.wrappers import Response

app=Flask(__name__)


@app.route(‘/about/‘)
def about():
    resp=Response(response=‘about page‘,status=200,content_type=‘text/html;charset=utf8‘)
    return resp

如果返回的是一个元组,元组中的数据类型是(response,status,headers)。status会覆盖默认的200状态码,headers可以是一个列表或者字典作为额外的消息头


from flask import Flask
from flask import make_response
from werkzeug.wrappers import Response

app=Flask(__name__)


@app.route(‘/about/‘)
def about():
return ‘about page‘,200,{‘server‘:‘xiaomingyan‘}


if __name__ ==‘__main__‘:
app.run(host=‘127.0.0.1‘,port=8080) # 运行,指定监听地址为127.0.0.1:8080

 


 技术分享图片

如果以上条件都不满足,Flask会假设返回值是一个合法的WSGI应用程序,并通过Response.force_type(rv,request.environ)转换为一个请求对象

我们尝试返回一个字典,字典不满足上面的三个条件,因此进入第4步,但是字典也不是一个合法的WSGI应用程序,因此不是一个可请求对象。产生异常!

@app.route(/about/)
def about():
    return {name:heboan}

技术分享图片

如果我们想把所有的URL都发送 JSON数据,那么我们就可以执行响应

自定义响应必须满足3个条件

1、必须继承Response类

2、实现类方法force_type(cls, response, environ=None)

3、必须制定app.response_class为你定义的Response

我们可以定义一个叫做JSONResponse的类来代替Flask自带的Response类

#coding=utf-8

from flask import Flask
from werkzeug.wrappers import Response
from flask import jsonify


app=Flask(__name__)

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(/about/)
def about():
    return {name:xiaomingyan}

if __name__ ==__main__:
    app.run(host=127.0.0.1,port=8080) # 运行,指定监听地址为127.0.0.18080

技术分享图片

 

 

2019-01-1717:42

 

UP UP!!!

 















以上是关于Flask实战第6天:视图函数Response返回值的主要内容,如果未能解决你的问题,请参考以下文章

Flask企业级论坛实战目录导航

9Flask实战第9天:类视图

11Flask实战第11天:视图使用装饰器

29Flask实战第29天:cms用户名渲染和注销功能实现

2Flask实战第2天:URL传参

Flask实战第62天:帖子详情页布局