flask的response对象关于视图函数和普通函数 return的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask的response对象关于视图函数和普通函数 return的区别相关的知识,希望对你有一定的参考价值。

参考技术A flask视图函数与普通的函数不同,视图函数中return除本身返回的内容之外,还会返回一些附加内容。比如headers和status code.
headers中包含'content-type'和'location'等属性
以下为视图函数返回示例:

flask中的response

1、Response

在flask中你想向前端返回数据,必须是Response的对象,这里和django必须是HttpResponse 对象一样, 主要将返回数据的几种方式

  1. 视图函数中return 字符串

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/index")
    def index():
     return "index.html"
    
    if __name__ == "__main__":
     app.run()
  2. return 多个值

    @app.route("/page_one")
    def page_one():
        return "index.html", "200 Ok", {"name": "aaa"}
    

    return后面的值说明:index.html 表示字符串,也就是网站页面显示的内容

    ? ‘200 ok‘ 表示状态码和对状态码的解析

    ? {"name":"aaa"} 表示请求头

    请求头不是必须要的,但是前面两个必须要,前提你是retrun多个值,还有就是顺序不能改变。

  3. return make_response

    @app.route("/page_two")
    def page_two():
        response = make_response('page_two page', 200)
        response.headers["name"] = "page_four"
        return response
    
    
    @app.route("/page_three")
    def page_three():
        response = make_response('page_three page')
        return response, 200, {"name": "page_three"}
    
    
    @app.route("/page_four")
    def page_four():
        response = make_response('page_four page', 200, {"name": "page four"})
        return response

    分析下上面的三种方法,都是能够成功返回的。总结下

    make_response 它可以传递三个参数 第一个还是一个字符串,第二个传状态码,第三个传请求头,

    关于return 还是和 return 多个值分析差不多,只不过第一个参数不是字符串,而是一个对象了。

  4. return Response对象

    from flask import Response
    
    @app.route("/page_five")
    def page_five():
        response = Response("page five")
        response.status_code = 299
        response.status = "298 notok"
        return response, "297 okok", {"name": "page fiv"}

总结:

  1. 视图函数可以返回一个元组(也就是多个值),返回多个值的话,必须注意顺序,第一位必须为字符串或者Response对象,第二个参数应该为状态码,第三个参数就是请求头里的数据了
  2. 如果返回一个值的话,那么就是一个字符串,或者就是Response对象
  3. 还有就是make_response这个函数的返回值应该也是Response的对象,额额,刚刚打印了type(make_response()) 结果为 flask.wrappers.Response ,确实是Response的对象。

render_template : 导入方式 from flask import render_template

def render_template(template_name_or_list, **context):
    pass

它的作用就是模板渲染,最终返回html渲染好了的字符串,它需要传递的参数就是 模板的名字,也就是需要渲染的html页面,还有就是这样格式的数据:key1 = value1,key2=value2这样的格式,传这些变量到模板中,肯定是渲染变量用。

redirect :导入方式 from flask import redirect

def redirect(location, code=302, Response=None):
    pass

它的作用就是重定向,需要传的参数就是重定向的地址,最终返回的Response的对象

2、Response中的几个属性

  1. headers : 设置请求头信息
  2. status : String类型的数据,格式为这种:"200 ok"
  3. status_code : int 类型,就是状态码,但是不能是自定义的状态码
  4. data : 需要返回到前端的数据
  5. set_cookie :设置cookie 的值
  6. del_cookie :删除cookie ,不会立马删除浏览器上报错的cookie 值,会讲过期时间设置为当前时间,还是cookie 创建的时间,这样就表示过期了,浏览器会自动删除。

3、写一个登陆成功设置cookie的例子

from flask import Flask, request, Response

app = Flask(__name__)

@app.route('/login', methods=["get", "post"], endpoint='login')
def login():
    if request.method == "POST":
        response = Response()
        name = request.form.get("name")
        pwd = request.form.get("pwd")
        if name and pwd:
            if name == '朱宇' and pwd == '123':
                response.data = '登陆成功'
                # 注意,我这里只是写个例子,不会拿明文的账号密码设置为cookie
                response.set_cookie('name', '朱宇')
                response.set_cookie('pwd', '123')
            else:
                response.data = '用户名或密码错误'
        else:
            response.data = '用户名或密码不能为空'
        return response
    elif request.method == 'GET':
        # 我这里返回字符串表示一个页面,你完全可以写一个html页面,使用render_template这个方法返回
        return 'login.html'

if __name__ == "__main__":
    app.run(debug=True)

下面我用postman做下测试,

技术图片

再看上面红色狂圈住的地方,这就是我们设置的两个cookies,鼠标点进去看

技术图片

你们有这样的疑问的吗?我最终还是返回的Response的对象,那么浏览器是怎么知道我对cookie进行操作呢?

答案在这里,就是响应的请求头,看看返回了哪些数据

技术图片

Response 的介绍大概就是这样,还有其他属性请参考flask官方API

以上是关于flask的response对象关于视图函数和普通函数 return的区别的主要内容,如果未能解决你的问题,请参考以下文章

响应对象Response

响应对象Response

响应对象Response

Flask实战第6天:视图函数Response返回值

flask中的response

flask基础之Response响应对象