- 瀏覽器請求服務器是無狀態的。無狀態指一次用戶請求時,瀏覽器、服務器無法知道之前這個用戶做過什麼,每次請求都是一次新的請求
- 無狀態的應用層面的原因是:瀏覽器和服務器之間的通信都遵守HTTP協議
- 根本原因是:瀏覽器與服務器是使用Socket套接字進行通信的,服務器將請求結果返回給瀏覽器之後,會關閉當前的Socket連接,而且服務器也會在處理完頁面後銷燬頁面對象。
- 當需要保存用戶瀏覽狀態時,如用戶狀態,商品瀏覽記錄等,可以通過以下兩種方式:
在客戶端存儲信息使用Cookie
在服務器端存儲信息使用Session
Cookie
- Cookie,有時也用其複數形式Cookies,指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)
- Cookie是由服務器端生成,發送給User-Agent(一般是瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給服務器(前提是瀏覽器設置爲啓用cookie)
- Cookie名稱和值可以由服務器端開發自己定義,這樣服務器可以知道該用戶是否是合法用戶以及是否需要重新登錄等。服務器可以利用Cookies包含信息的任意性來篩選並經常性維護這些信息,以判斷在HTTP傳輸中的狀態。
- Cookie是存儲在瀏覽器中的一段純文本信息,建議不要存儲敏感信息如密碼,因爲電腦上的瀏覽器可能被其它人使用
Cookie的特點
- Cookie以鍵值對的格式進行信息的存儲
- Cookie在服務端創建後,發送到客戶端保存,再次訪問時隨着請求發送到服務器端
- Cookie基於域名安全,不同域名的Cookie是不能互相訪問的
- Cookie的典型應用:記住用戶名,網站的廣告推送
設置Cookie
- 修改urls.py文件:
url(r'^cookie_set/$', views.cookie_set),
- 修改
views.py
文件,創建視圖cookie_set
def cookie_set(request):
response = HttpResponse("<h1>設置Cookie,請查看響應報文頭</h1>")
response.set_cookie('ck1', 'hello')
return response
- 通過瀏覽器查看Cookie信息
讀取Cookie
Cookie信息被包含在請求頭中,使用request對象的COOKIES屬性訪問。
- 修改
cookie_set()
函數
def cookie_set(request):
response = HttpResponse("讀取Cookie,數據如下:<br>")
if 'ck1' in request.COOKIES:
response.write('<h1>' + request.COOKIES['ck1'] + '</h1>')
return response
- 通過瀏覽器查看Cookie信息
Session
- Session以鍵值對的形式存儲在服務端,鍵與Cookie中的
sessionid
相同,值是開發人員設置的鍵值對信息,進行了base64編碼,過期時間由開發人員設置- 服務器會在Cookie中存儲一個
sessionid
,瀏覽器每次請求時會將這個數據發給服務器,服務器根據收到sessionid
找出對應的Session數據- Session用於存儲敏感的、重要的信息,如真實姓名、餘額、等級、驗證碼等
對象及方法
通過HttpRequest
對象的session
屬性進行會話的讀寫操作
- 以鍵值對的格式寫session:
request.session['鍵']=值
- 根據鍵讀取值:
request.session.get('鍵',默認值)
- 清除所有session中值部分:
request.session.clear()
- 清除整條session數據:
request.session.flush()
- 刪除session中指定的鍵和值:
del request.session['鍵']
- 設置會話的超時時間(默認兩星期):
request.session.set_expiry(value)
如果value是一個整數,會話將在value秒沒有活動後過期。
如果value爲0,那麼用戶會話的Cookie將在用戶的瀏覽器關閉時過期。
如果value爲None,那麼會話永不過期。
實例演練: 寫入Session
- 修改urls.py文件:
url(r'^session_write/$',views.session_write),
- 修改views.py文件:
def session_write(request):
request.session['s1'] = 'hello'
return HttpResponse('寫session')
- 在調試工具中查看響應頭中創建的Cookie,裏面有個鍵爲
sessionid
- 數據表
django_session
中也增加了相應記錄
- 將數據表中的
seession_data
,在Base64解碼中進行解碼,結果如下圖
實例演練: 讀取Session
- 修改urls.py文件:
url(r'^session_read/$',views.session_read),
- 修改views.py文件:
def session_read(request):
s1 = request.session.get('s1')
return HttpResponse(s1)
- 在瀏覽器中查看結果
實例演練: 刪除Session
def session_test(request):
del request.session['s1']
return HttpResponse('ok')