Djiango中的cookie與session
狀態保持
- 瀏覽器請求伺服器是無狀態的。
- 無狀態:指一次使用者請求時,瀏覽器、伺服器無法知道之前這個使用者做過什麼,每次請求都是一次新的請求。
- 無狀態原因:瀏覽器與伺服器是使用Socket套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的Socket連線,而且伺服器也會在處理頁面完畢之後銷燬頁面物件。
- 有時需要保持下來使用者瀏覽的狀態,比如使用者是否登入過,瀏覽過哪些商品等
- 實現狀態保持主要有兩種方式:
- 在客戶端儲存資訊使用
Cookie
- 在伺服器端儲存資訊使用
Session
- 在客戶端儲存資訊使用
Cookie
Cookie,有時也用其複數形式Cookies,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密)。Cookie最早是網景公司的前僱員Lou Montulli在1993年3月的發明。Cookie是由伺服器端生成,傳送給User-Agent(一般是瀏覽器),瀏覽器會將Cookie的key/value儲存到某個目錄下的文字檔案內,下次請求同一網站時就傳送該Cookie給伺服器(前提是瀏覽器設定為啟用cookie)。Cookie名稱和值可以由伺服器端開發自己定義,這樣伺服器可以知道該使用者是否是合法使用者以及是否需要重新登入等。伺服器可以利用Cookies包含資訊的任意性來篩選並經常性維護這些資訊,以判斷在HTTP傳輸中的狀態。Cookies最典型記住使用者名稱。
Cookie是儲存在瀏覽器中的一段純文字資訊,建議不要儲存敏感資訊如密碼,因為電腦上的瀏覽器可能被其它人使用。
Cookie的特點
- Cookie以鍵值對的格式進行資訊的儲存。
- Cookie基於域名安全,不同域名的Cookie是不能互相訪問的,如訪問itcast.cn時向瀏覽器中寫了Cookie資訊,使用同一瀏覽器訪問baidu.com時,無法訪問到itcast.cn寫的Cookie資訊。
- 當瀏覽器請求某網站時,會將瀏覽器儲存的跟網站相關的所有Cookie資訊提交給網站伺服器。
1 設定Cookie
可以通過HttpResponse物件中的set_cookie方法來設定cookie。
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
- max_age單位為秒,預設為None 。如果是臨時cookie,可將max_age設定為None。
示例:
def cookie(request): response = HttpResponse('ok') response.set_cookie('itcast1', 'python1') # 臨時cookie response.set_cookie('itcast2', 'python2', max_age=3600) # 有效期一小時 return response
2 讀取Cookie
可以通過HttpResponse物件的COOKIES屬性來讀取本次請求攜帶的cookie值。request.COOKIES為字典型別。
def cookie(request):
cookie1 = request.COOKIES.get('itcast1')
print(cookie1)
return HttpResponse('OK')
3 刪除Cookie
可以通過HttpResponse物件中的delete_cookie方法來刪除。
response.delete_cookie('itcast2')
Session
1 啟用Session
Django專案預設啟用Session。
可以在settings.py檔案中檢視,如圖所示
如需禁用session,將上圖中的session中介軟體註釋掉即可。
2 儲存方式
在settings.py檔案中,可以設定session資料的儲存方式,可以儲存在資料庫、本地快取等。
2.1 資料庫
儲存在資料庫中,如下設定可以寫,也可以不寫,這是預設儲存方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
如果儲存在資料庫中,需要在項INSTALLED_APPS中安裝Session應用。
資料庫中的表如圖所示
表結構如下
由表結構可知,操作Session包括三個資料:鍵,值,過期時間。
2.2 本地快取
儲存在本機記憶體中,如果丟失則不能找回,比資料庫的方式讀寫更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
2.3 混合儲存
優先從本機記憶體中存取,如果沒有則從資料庫中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
2.4 Redis
在redis中儲存session,需要引入第三方擴充套件,我們可以使用django-redis來解決。
1) 安裝擴充套件
pip install django-redis
2)配置
在settings.py檔案中做如下設定
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
注意
如果redis的ip地址不是本地迴環127.0.0.1,而是其他地址,訪問Django時,可能出現Redis連線錯誤,如下:
解決方法:
修改redis的配置檔案,新增特定ip地址。
開啟redis的配置檔案
sudo vim /etc/redis/redis.conf
在如下配置項進行修改(如要新增10.211.55.5地址)
重新啟動redis服務
sudo service redis-server restart
3 Session操作
通過HttpRequest物件的session屬性進行會話的讀寫操作。
1) 以鍵值對的格式寫session。
request.session['鍵']=值
2)根據鍵讀取值。
request.session.get('鍵',預設值)
3)清除所有session,在儲存中刪除值部分。
request.session.clear()
4)清除session資料,在儲存中刪除session的整條資料。
request.session.flush()
5)刪除session中的指定鍵及值,在儲存中只刪除某個鍵及對應的值。
del request.session['鍵']
6)設定session的有效期
request.session.set_expiry(value)
- 如果value是一個整數,session將在value秒沒有活動後過期。
- 如果value為0,那麼使用者session的Cookie將在使用者的瀏覽器關閉時過期。
- 如果value為None,那麼session有效期將採用系統預設值, 預設為兩週,可以通過在settings.py中設定SESSION_COOKIE_AGE來設定全域性預設值。