flask基礎之Response響應對象(九)

前言

Response對象負責對客戶端的響應,每個請求都會有一個Response對象,那麼它在一個請求的聲明週期內是怎麼發揮做用的呢?html

Response對象

響應發生的位置

先回顧一下http請求的flask處理流程:python

接收請求--》建立請求上下文--》請求上下文入棧--》建立該請求的應用上下文--》應用上下文入棧--》調用視圖函數處理邏輯--》請求上下文出棧--》應用上下文出棧json

Response對象在調用視圖函數處理邏輯後就被建立,可是對客戶端的響應在應用上下文出棧後執行。flask

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的回調函數。cookie

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給咱們的回調函數,調用它就能夠設置響應的狀態碼和響應頭;session

  • return返回給客戶端Body部分。app

總結

Response對象負責接收通過視圖函數處理後的返回數據,將其解析編碼成http協議要求的數據格式,而後調用http服務器的回調函數同時將數據返回給客戶端。dom

參考

相關文章
相關標籤/搜索