http協議沒有提供多次請求之間的關聯功能,協議的本意也并未考慮到多次請求之間的狀態維持,每一次請求都被協議認為是一次性的。但在某些場景下,如一次登錄多次訪問,我們希望可以保存登錄狀態,協議并沒有直接提供會話跟蹤的支持,需要靠其他手段來幫助實現目標。
1、對cookie的理解
cookie是一個key-value的數據結構(類似python字典),用于保存需要維護狀態的數據,cookie與session最大的區別是cookie的數據保存在客戶端,而session把數據保存在服務端。 cookie一般由服務器設置,并可以存放在http的請求頭和響應頭中。 cookie由瀏覽器保存,瀏覽器已經實現了cookie的保存和發送,而服務器上對cookie的設置和接收則需要我們配置。 通過cookie,可以在多個會話之間共享一些必要的信息如登錄狀態數據、歷史訪問記錄、個性化定制設置等,以實現會話跟蹤,讓用戶感覺到網站可以'記錄'自己的偏好,減少不必要的重復輸入,從而提升用戶體驗。2、cookie的使用接口
django的服務端發送響應有三種方式:
1. return HttpResponse()
2. return render()
3. return redirect()
這三種方法實例化的結果都是HttpResponse類的實例,可以直接用于設置cookie。
在response對象上執行set_cookie(key,value,...)即可設置cookie, 其中特別注意cookie屬性的設置。
cookie的設置
服務器在響應對象上進行set_cookie操作,一旦設置完成,客戶端后續的請求就可以根據cookie的屬性規則攜帶cookie數據。
def set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)
cookie的獲取
服務器在請求對象上通過request.COOKIES得到cookie字典數據,注意此處拿到的cookie數據從安全性來說是未被驗證正確性的。
@cached_propertydef COOKIES(self): raw_cookie = get_str_from_wsgi(self.environ, 'HTTP_COOKIE', '') return parse_cookie(raw_cookie)
注意1:cookie在set的時候可以設置它被發送的范圍,每個cookie都有對應的domain+path的屬性,這約束了cookie發送范圍,只有當http的請求落在此范圍中的url,才會攜帶此cookie。
注意2:一個cookie就是一個key-value項,不過它還攜帶有屬性。一個cookies是一個字典,保存了很多cookie項,注意單個cookie項和整個cookies字典的關系。
3、cookie的屬性
max_age:
失效延遲時間,單位是秒,設置成15秒意味著在設置完之后的15秒之內,此cookie有效,超時之后cookie失效,瀏覽器會刪除失效的cookie。此參數默認是None,代表著直到瀏覽器關閉,即默認是會話cookie。
新聞熱點
疑難解答