响应Response:
视图函数的返回值会自动转换为一个响应对象:
- 如果返回的是一个字符串,那么flask会重新创建一个werkzeug,wrappers,Response对象,Response将该字符串作为主体,状态码为200,MIME的类型为text/html,然后返回该Response对象。
- 如果返回的是一个元组,元组的数据类型是(response, status, headers).
status的值会覆盖默认的200状态码,headers可以是一个列表和字典,作为额外的消息头。
- 可以返回’Response‘及其子类。
@app.route('/n1/')
def hello_world():
return 'Hello World!'
# 等价于
# Response('Hello World!', status=200, mimetype='text/html')
@app.route('/n2/')
def number_2():
return 'n2', 200, {'MY-name': 'Charlie'}
# 如果返回的是一个元组,元组的类型是(response, status, headers).
# status值会覆盖默认的200状态码,headers可以是一个列表或者字典,作为额外的消息头。
实现一个自定义’Response‘对象:
- 继承自‘Response’类。
- 实现方法‘force_type(cls,response,environ=None)。
- 指定’app.response_class'为你自定义的'Response'对象。
- 如果视图函数的返回数据,不是字符串,也不是元组,也不是Response对象,那么就会将返回值传给‘force_type',然后将force_type的返回值返回给前端。
class JSONResponse(Response):
@classmethod
def force_type(cls, response, environ=None):
if isinstance(response, dict):
response = jsonify(response)
# jsonify除了将字典转换成json对象,还将把对象包装成一个Response对象
return super(JSONResponse, cls).force_type(response, environ)
# return response
app.response_class = JSONResponse
@app.route('/n3/')
def my_response():
return {'username': 'charlie', 'age': 20}
网友评论