6、Flask实战第6天:视图函数Response返回值
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下:
如果返回的是一个合法的响应对象,则直接返回
可以使用make_response函数来创建Response对象,这个方法可以设置额外的数据,比如cookie、header信息等
... from flask import make_response @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.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可以是一个列表或者字典作为额外的消息头
@app.route('/about/') def about(): return 'about page', 200, {'server':'heboan'}
如果以上条件都不满足,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类
... from werkzeug.wrappers import Response from flask import jsonify 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':'heboan'}
每天进步一点,加油!