flask-response
- 关于响应:
- 视图函数的返回值会被自动转换成一个响应对象,flask的转换逻辑如下:
- 如果返回的是一个字符串,那么flask会重新创建一个werkzeug.wrappers.Response的对象,Response将该字符串作为主体,状态码为200, MIME为text/html,然后返回Response
- 如果返回的是一个元祖,元祖中的数据类型应该是 (response, status, headers). status值会覆盖默认的200的状态码, header可以是一个列表或者字典,作为消息的响应头。
- 如果返回的是一个Response对象,则直接返回。
- 如果以上条件都不满足,flask会去调用Response.force_type来尝试转换为一个这样的请求
-
1 from flask import Flask, Response, jsonify 2 3 app = Flask(__name__) 4 5 6 class JsonResponse(Response): 7 @classmethod 8 def force_type(cls, response, environ=None): 9 if isinstance(response, dict): 10 response = jsonify(response) 11 return super(JsonResponse, cls).force_type(response, environ) 12 13 14 app.response_class = JsonResponse 15 16 17 @app.route('/') 18 def index(): 19 response = Response(response='HELLO', status=200, content_type='text/html;charset=utf-8') 20 return response 21 22 23 @app.route('/json') 24 def json_test(): 25 return {'hello': 'world'} 26 27 28 if __name__ == '__main__': 29 app.run()
-
flask自定义返回对象类
- 创建自定义对象类需要继承Response类
- 当需要返回满足flask原本不支持返回的某种数据类型时,需要重写类方法force_type
- 然后将处理的response对象让父类的Response来处理
- 将app的返回类设置为自定义的返回类
- 视图函数的返回值会被自动转换成一个响应对象,flask的转换逻辑如下: