Django之cookie和session

  • 2019 年 10 月 3 日
  • 筆記

Django1.8.2中文文檔:Django1.8.2中文文檔

http協議是無狀態的。下一次去訪問一個頁面時並不知道上一次對這個頁面做了什麼。

無狀態的應用層面的原因是:瀏覽器和伺服器之間的通訊都遵守HTTP協議。

根本原因是:瀏覽器與伺服器是使用Socket套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的Socket連接,而且伺服器也會在處理頁面完畢之後銷毀頁面對象。

 

有時需要保存下來用戶瀏覽的狀態,比如用戶是否登錄過,瀏覽過哪些商品等。 實現狀態保持主要有兩種方式:

  • 在客戶端存儲資訊使用Cookie。
  • 在伺服器端存儲資訊使用Session。

cookie

cookie及其使用

cookie是由伺服器生成,存儲在瀏覽器端的一小段文本資訊。
cookie的特點:

  • 1)以鍵值對方式進行存儲。
  • 2)通過瀏覽器訪問一個網站時,會將瀏覽器存儲的跟網站相關的所有cookie資訊發送給該網站的伺服器。request.COOKIES
  • 3)cookie是基於域名安全的。www.baidu.com www.tudou.com
  • 4)cookie是有過期時間的,如果不指定,默認關閉瀏覽器之後cookie就會過期。

 

cookie使用示例

設置cookie

def set_cookie(request):      """設置cookie資訊"""      response = HttpResponse("設置cookie")      # 設置一個cookie資訊,名字為num,值為1      response.set_cookie('num', 1)      # 返回response      return response

獲取cookie

def get_cookie(request):      """獲取cookie資訊"""      # 取出cookie num的值      num = request.COOKIES['num']      return HttpResponse(num)

設置cookie過期時間

def set_cookie(request):      """攝製cookie資訊"""      response = HttpResponse("設置cookie")      # 設置一個cookie資訊,名字為num,值為1,並且設置 cookie的過期時間為2周,兩種方式      response.set_cookie('num', 1, max_age=14*24*3600)      # response.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14))      return response

設置多個cookie

def set_cookie(request):      """攝製cookie資訊"""      response = HttpResponse("設置cookie")       # 設置多個cookie      response.set_cookie('num', 1)      response.set_cookie('num2', 2)      return response

 

cookie記住用戶名示例

編寫login.html

<!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <title>Login</title>      <meta name="viewport" content="width=device-width, initial-scale=1">  </head>  <body>  <form action="/login_check/" method="post">      <label for="username">用戶:          <input type="text" id="username" name="username" value="{{ usernam }}">      </label>      <br />      <label for="password">密碼:          <input type="password" id="password" name="password">      </label>      <br />      <input type="checkbox" name="remember">記住用戶名      <br />      <input type="submit" value="登錄">  </form>    </body>  </html>

編寫login_check函數

def login_check(request):      # 1.獲取用戶名和密碼      username = request.POST.get("username")      password = request.POST.get("password")      remember = request.POST.get("remember")      print(username, password)      # 2.進行校驗      # 3.返回應答      if username == "yifchan" and password == "yifchan":          response = redirect("/index")          # 判斷是否需要記住用戶名          if remember == 'on':              # 設置cookie username-過期時間為1周              response.set_cookie('username', username, max_age=7*24*3600)          return response      else:          return HttpResponse("帳號或密碼錯誤")

編寫login函數

def login(request):      """登錄處理函數"""      # 獲取cookie username      if 'username' in request.COOKIES:          username = request.COOKIES['username']      else:          username = ''      return render(request, "booktest/login.html", {'usernam': username})

設計路由

url(r'^login/$', views.login),  url(r'^login_check/$', views.login_check), 

 

Session

session存儲在伺服器端。

session的特點:

  • 1) session是以鍵值對進行存儲的。
  • 2) session依賴於cookie。唯一的標識碼保存在sessionid cookie中。
  • 3) session也是有過期時間,如果不指定,默認兩周就會過期。

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)設置會話的超時時間,如果沒有指定過期時間則兩個星期後過期。

request.session.set_expiry(value)
  • 如果value是一個整數,會話將在value秒沒有活動後過期。
  • 如果value為0,那麼用戶會話的Cookie將在用戶的瀏覽器關閉時過期。
  • 如果value為None,那麼會話永不過期。

 

session使用示例

# 設置session  def set_session(request):      """設置session"""      request.session['username'] = 'yifchan'      request.session['age'] = 18      request.session.set_expiry(10)  # 設置session的有效時間為10s      return HttpResponse('設置session成功')      # 獲取session  def get_session(request):      """獲取session"""      username = request.session['username']      age = request.session['age']      info = username + ":" + age      return HttpResponse(info)      # 清除session  def clear_session(request):      """清除session資訊"""      # request.session.clear()  # 只會清除有用資訊部分,但這整條資訊不回被清除      request.session.flush()  # 清除整條session資訊      return HttpResponse("清除session成功")

注意:所謂的session過期指的是瀏覽器端存儲的cookie的sessionid過期了。

 

cookie和session的應用場景

cookie:記住用戶名。安全性要求不高。
session:涉及到安全性要求比較高的數據。例如銀行卡賬戶,密碼等。

 

Tags: