6. flask中视图函数Response返回值详解

视图函数中可以返回哪些值:

  1. 可以返回字符串:返回的字符串其实底层将这个字符串包装成了一个Response对象。
  2. 可以返回元组:元组的形式是(响应体,状态码,头部信息),也不一定三个都要写,写两个也是可以的。返回的元组,其实在底层也是包装成了一个Response对象。
  3. 可以返回Response及其子类。

实现一个自定义的Response对象:

  1. 继承自Response类。
  2. 实现方法force_type(cls,rv,environ=None)
  3. 指定app.response_class为你自定义的Response对象。
  4. 如果视图函数返回的数据,不是字符串,也不是元组,也不是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)

发布了13 篇原创文章 · 获赞 0 · 访问量 83

猜你喜欢

转载自blog.csdn.net/qq_35283167/article/details/104639948