视图函数中可以返回哪些值:
- 可以返回字符串:返回的字符串其实底层将这个字符串包装成了一个
Response
对象。 - 可以返回元组:元组的形式是(响应体,状态码,头部信息),也不一定三个都要写,写两个也是可以的。返回的元组,其实在底层也是包装成了一个
Response
对象。 - 可以返回
Response
及其子类。
实现一个自定义的Response
对象:
- 继承自
Response
类。 - 实现方法
force_type(cls,rv,environ=None)
。 - 指定
app.response_class
为你自定义的Response
对象。 - 如果视图函数返回的数据,不是字符串,也不是元组,也不是Response对象,那么就会将返回值传给
force_type
,然后再将force_type
的返回值返回给前端。
demo
from flask import Flask, Response, jsonify, render_template
# flask = werkzeug + sqlalchemy + jinja2
app = Flask(__name__)
# 将视图函数中返回的字典,转换成json对象,然后返回
# restful-api
class JSONResponse(Response):
@classmethod
def force_type(cls, response, environ=None):
"""
这个方法只有视图函数返回非字符、非元组、非Response对象才会调用
response:视图函数的返回值
"""
# 判断是否为字典
if isinstance(response, dict):
# jsonify除了将字典转换成json对象,还将改对象包装成了一个Response对象
response = jsonify(response)
return super(JSONResponse, cls).force_type(response, environ)
app.response_class = JSONResponse
@app.route('/')
def hello_world():
# Response('Hello World!',status=200,mimetype='text/html')
return 'Hello World!'
@app.route('/list1/')
def list1():
resp = Response('list1')
# response.set_cookie(key,value[,max_age=None,exprise=None)]
"""
response.set_cookie(key,value[,max_age=None,exprise=None)]
max_age: 整数,指定cookie过期时间
expries: 整数,指定过期时间,可以指定一个具体日期时间
max_age和expries两个选一个指定
"""
resp.set_cookie('country','china')
return resp
# 返回元组
@app.route('/list2/')
def list2():
return 'list2',200,{'MY-NAME':'cuiky'}
@app.route('/list3/')
def list3():
return {'username':'cuiky','age':23}
if __name__ == '__main__':
app.run(debug=True,port=8000)