• flask基础之Response响应对象(九)


    前言

    Response对象负责对客户端的响应,每一个请求都会有一个Response对象,那么它在一个请求的声明周期内是怎么发挥作用的呢?

    Response对象

    响应发生的位置

    先回顾一下http请求的flask处理流程:

    接收请求--》创建请求上下文--》请求上下文入栈--》创建该请求的应用上下文--》应用上下文入栈--》调用视图函数处理逻辑--》请求上下文出栈--》应用上下文出栈

    Response对象在调用视图函数处理逻辑后就被创建,但是对客户端的响应在应用上下文出栈后执行。

    app在视图函数处理逻辑完成后得到响应需要的Body,code和header,调用make_response方法创建一个Response对象。

    响应对象分析

    • Response初始化
    class Response(BaseResponse):
        pass
    class BaseResponse(object):
        charset = 'utf-8' # 设置响应对象的编码
        default_status = 200 # 设置默认的响应状态码
        default_mimetype = 'text/plain' # 设置响应的body默认的类型,即text文本
        automatically_set_content_length = True # 设置是否使用默认的长度限制响应大小
        max_cookie_size = 4093 # 允许的默认cookie最大的字节数,大于仍然会被发送,但可能被浏览器忽略
    
        def __init__(self, response=None, status=None, headers=None,
                     mimetype=None, content_type=None, direct_passthrough=False):
            pass
    
    # 初始化参数
    response:响应数据的body部分,
    status:响应的状态码
    headers:响应的头部
    mimetype:如果charset参数没有设置就使用这个设置
    content_type:响应body的格式,如text或json等
    
    • 重要的属性和方法
    response.data:获取二进制的响应body数据
    response.data = 'xxx' :设置响应body数据
    response.calculate_content_length:获取响应的总字节数
    response.header:获取响应对象的头部信息
    response.status:获取字符串格式的响应状态码
    response.status_code:获取int格式的响应状态码
    
    response.freeze():将响应对象序列化,返回None
    response.set_cookie():设置cookie
    response.delete_cookie():删除cookie,将cookie设置为立即失效
    
    • set_cookie

    设置cookie这个方法使用比较频繁,即原理是对响应头的Set-Cookie键的值进行设置,其受到response对象的max_cookie_size参数的限制。

    def set_cookie(self, key, value='', max_age=None, expires=None,
                    path='/', domain=None, secure=False, httponly=False):
        pass
    
    # 参数:
    key:cooke的键值对的键;
    value:cooke的键值对的值;
    max_age:cookie的有效时间,单位为秒,如果为None,则设置成和session一样的时间长度
    expires:cookie的终止日期;
    path:定义服务器上哪些路径下的接口可获取服务器设置的Cookie,默认为/
    domain:确定了哪些Internet域中的Web服务器可读取浏览器所存取的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。
    secure:如果设置为True,传输必须使用https协议
    httponly:如果设置为True,表示允许js脚本访问cookie,设置为false表示不允许;
    

    发送响应

    Response对象在创建后就需要向客户端发送响应了,我们知道,它会调用http服务器如gunicorn的回调函数。

    class Response:
        def __call__(self, environ, start_response):
            app_iter, status, headers = self.get_wsgi_response(environ)
            start_response(status, headers)
            return app_iter
    
    • start_response是gunicorn给我们的回调函数,调用它就可以设置响应的状态码和响应头;

    • return返回给客户端Body部分。

    总结

    Response对象负责接收经过视图函数处理后的返回数据,将其解析编码成http协议要求的数据格式,然后调用http服务器的回调函数同时将数据返回给客户端。

    参考

  • 相关阅读:
    【持久化框架】Mybatis与Hibernate的详细对比
    [Linux] day03——REHL部署
    [Linux] day02——什么是Linux
    [Linux] day01——运维
    java也可以做出很漂亮的界面
    python的沙盒环境--virtualenv
    Java虚拟机(JVM)中的内存设置详解
    高手教大家如何配置JVM参数
    最全的静态网站生成器(开源项目)
    Java 8 简明教程
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/10084503.html
Copyright © 2020-2023  润新知