1. Cookie Cookie,有時也用其複數形式Cookies,指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。Cookie最早是網景公司的前雇員Lou Montulli在1993年3月的發明。Cookie是由伺服器端生成,發送給User-Agen ...
1. Cookie
Cookie,有時也用其複數形式Cookies,指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。Cookie最早是網景公司的前雇員Lou Montulli在1993年3月的發明。Cookie是由伺服器端生成,發送給User-Agent(一般是瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給伺服器(前提是瀏覽器設置為啟用cookie)。Cookie名稱和值可以由伺服器端開發自己定義,這樣伺服器可以知道該用戶是否是合法用戶以及是否需要重新登錄等。伺服器可以利用Cookies包含信息的任意性來篩選並經常性維護這些信息,以判斷在HTTP傳輸中的狀態。Cookies最典型記住用戶名。
Cookie是存儲在瀏覽器中的一段純文本信息,建議不要存儲敏感信息如密碼,因為電腦上的瀏覽器可能被其它人使用。
1.1 Cookie的特點
Cookie以鍵值對的格式進行信息的存儲。
Cookie基於功能變數名稱安全,不同功能變數名稱的Cookie是不能互相訪問的,如訪問itcast.cn時向瀏覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時,無法訪問到itcast.cn寫的Cookie信息。
當瀏覽器請求某網站時,會將瀏覽器存儲的跟網站相關的所有Cookie信息提交給網站伺服器。
典型應用:記住用戶名,網站的廣告推送。
這些廣告推送的商品是基於你曾經在淘寶上點擊的商品類別等條件篩選出來的,看上去這是在鳳凰網上訪問淘寶網的Cookie,但是事實不是這樣的,一般是採用iframe標簽嵌套一個淘寶的廣告頁面到鳳凰網的頁面上,所以淘寶的Cookie並沒有被鳳凰網讀取到,而是依然交給淘寶網讀取的,可以通過"開發者工具"查看元素。
1.2 設置Cookie
打開booktest/views.py文件,創建視圖cookie_set。
def cookie_set(request): response = HttpResponse("<h1>設置Cookie,請查看響應報文頭</h1>") response.set_cookie('h1', '你好') return response
打開booktest/urls.py文件,配置url。
url(r'^cookie_set/$',views.cookie_set),
在瀏覽器輸入如下網址。
http://127.0.0.1:8000/cookie_set/
在"開發者工具"中可以在響應頭中查看到設置的Cookie信息。
1.3 讀取Cookie
Cookie信息被包含在請求頭中,使用request對象的COOKIES屬性訪問。
打開booktest/views.py文件,創建視圖cookie_get。
def cookie_get(request): response = HttpResponse("讀取Cookie,數據如下:<br>") if 'h1' in request.COOKIES: response.write('<h1>' + request.COOKIES['h1'] + '</h1>') return response
打開booktest/urls.py文件,配置url。
url(r'^cookie_get/$',views.cookie_get),
在瀏覽器輸入如下網址。
http://127.0.0.1:8000/cookie_get/
打開“開發者工具”,在請求頭中可以查看Cookie信息。
2. Session
對於敏感、重要的信息,建議要儲在伺服器端,不能存儲在瀏覽器中,如用戶名、餘額、等級、驗證碼等信息。
在伺服器端進行狀態保持的方案就是Session。
2.1 啟用Session
Django項目預設啟用Session。
打開test3/settings.py文件,在MIDDLEWARE_CLASSES中啟用Session中間件。
禁用Session:將Session中間件刪除。
2.2 存儲方式
打開test3/settings.py文件,設置SESSION_ENGINE項指定Session數據存儲的方式,可以存儲在資料庫、緩存、Redis等。
存儲在資料庫中,如下設置可以寫,也可以不寫,這是預設存儲方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
存儲在緩存中:存儲在本機記憶體中,如果丟失則不能找回,比資料庫的方式讀寫更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
混合存儲:優先從本機記憶體中存取,如果沒有則從資料庫中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
如果存儲在資料庫中,需要在項INSTALLED_APPS中安裝Session應用。
遷移後會在資料庫中創建出存儲Session的表。
表結構如下圖。
由表結構可知,操作Session包括三個數據:鍵,值,過期時間。
2.3 依賴於Cookie
所有請求者的Session都會存儲在伺服器中,伺服器如何區分請求者和Session數據的對應關係呢?
在使用Session後,會在Cookie中存儲一個sessionid的數據,每次請求時瀏覽器都會將這個數據發給伺服器,伺服器在接收到sessionid後,會根據這個值找出這個請求者的Session。
如果想使用Session,瀏覽器必須支持Cookie,否則就無法使用Session了。
存儲Session時,鍵與Cookie中的sessionid相同,值是開發人員設置的鍵值對信息,進行了base64編碼,過期時間由開發人員設置。
2.4 對象及方法
通過HttpRequest對象的session屬性進行會話的讀寫操作。
以鍵值對的格式寫session。
request.session['鍵']=值
根據鍵讀取值。
request.session.get('鍵',預設值)
清除所有session,在存儲中刪除值部分。
request.session.clear()
清除session數據,在存儲中刪除session的整條數據。
request.session.flush()
刪除session中的指定鍵及值,在存儲中只刪除某個鍵及對應的值。
del request.session['鍵']
設置會話的超時時間,如果沒有指定過期時間則兩個星期後過期。
request.session.set_expiry(value)
如果value是一個整數,會話將在value秒沒有活動後過期。
如果value為0,那麼用戶會話的Cookie將在用戶的瀏覽器關閉時過期。
如果value為None,那麼會話永不過期。