Response响应对象详解
- 导入方式
from flask import Response
视图函数的返回值被自动转换为一个响应对象, flask的转换逻辑
-
如果返回是一个合法的响应对象(Response), 则直接返回
-
如果返回值一个字符串, 那么flask会重新创建一个"werkzeug.wrapper.Response"对象, Response将该字符串作为主体, 状态码为200, MIME类型为 text/html, 然后返回该Response对象
-
如果返回的是一个元组, 元组中的数据是"(response, status, headers), status值会覆盖默认的200状态码, header可以是一个列表或者字典, 作为额外的消息头"
-
如果以上条件都不满足, flask会假设返回值是一个合法的WSGI 应用程序 并通过"Response.force_type(rv, request, environ)转换为一个请求对象"
-
示例代码1: 返回一个字符串
返回字符串相当于
-
返回一个元组示例代码
自定义Response对象
如果返回对象不是字符串, 也不元组和Response对象及其子类, 那么需要自定义Response对象
自定义Response对象需要满足的条件
定义一个类, 继承自Response类, 只有当返回不满足时吗才会触发该类
在定义的类中实现"force_type(cls, rv, environ)"方法
指定"app.response_class"为自定义的类名 例如: app.response_class=自定义类名
jsonify
- 导入方式:
from flask import jsonify
代码
from flask import jsonify, Response
class JsonResponse(Response):
@classmethod
def force_type(cls, response, environ=None):
"""
该方法只有视图函数返回非字符串, 元组,非Response对象才会调用
:param response: 视图函数的返回值
"""
if isinstance(response, dict):
response = jsonify(response)
# jsonify: 将返回的字典转换为json对象, 并且底层转换为Response对象
return super(JsonResponse, cls).force_type(response, environ)
app.response_class = JsonResponse