• 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服务器的回调函数同时将数据返回给客户端。

    参考

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/10084503.html
Copyright © 2020-2023  润新知