flask基礎之Response響應物件(九)
阿新 • • 發佈:2018-12-07
前言
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伺服器的回撥函式同時將資料返回給客戶端。