1. 程式人生 > >Django之cookie/session

Django之cookie/session

cookie

 

當我們通過瀏覽器來訪問網站的時候,由於HTTP本身是無狀態的,所以當我們結束訪問後第二次再來訪問的時候,伺服器本身是不認識我們(它不知道我們之前來過,也就不會儲存我們之前的資訊),比如當我們第一次登入的網站後第二次再來的時候我們還是需要重新登入,這樣網站不能儲存我們的密碼,是不是很麻煩,那如何解決這個問題呢?那cookie和session就是為了解決這個問題而產生的。

cookie:(1)我們第一次訪問伺服器的時候是 request直接請求過去,然後伺服器會返回response和一個設定好的cookie值給瀏覽器,這個cookie直接儲存在瀏覽器本地可以設定過期時間,當我們第二次訪問這個網站的時候我們傳送的伺服器的不在是單純的request而是加上了一個cookie值(這個值是唯一的,伺服器通過這個值來判斷這個訪問者是誰,有哪些記錄等),伺服器根據這些值再發給瀏覽器資訊。(圖左)

    (2)cookie是儲存在本地的一種儲存機制,大小不超過4Kb

session:(1)我們第一次訪問伺服器的時候,伺服器在產生一個session的檔案儲存在伺服器資料庫中,這session檔案中儲存的就是這個客戶的一些資訊包括一個session_id,使用者名稱,過期時間等等,並且是以加密的形式儲存;然後伺服器響應給瀏覽器的時候會把這個session_id傳送給瀏覽器,當用戶下次訪問伺服器的時候會把session_id一起傳送給伺服器,伺服器通過session_id去資料庫中查詢該使用者的資訊,解析這些資訊後,返回給瀏覽器特定的頁面。

    (2)session本身是一種思路,解決方案,不同的語言,框架設定session的方式不同;它是一種儲存在伺服器資料庫中的一種儲存方式;它是加密的。

 

Django中cookie的設定:

  設定cookie:

  response.set_cookie("key","value",max_age = 180,path="/cms/")

  1. key:這個cookiekey
  2. value:這個cookievalue
  3. max_age:最長的生命週期。單位是秒。
  4. expires:過期時間。跟max_age是類似的,只不過這個引數需要傳遞一個具體的日期,比如datetime或者是符合日期格式的字串。如果同時設定了expiresmax_age,那麼將會使用expires的值作為過期時間。
  5. path:對域名下哪個路徑有效。預設是對域名下所有路徑都有效。
  6. domain:針對哪個域名有效。預設是針對主域名下都有效,如果只要針對某個子域名才有效,那麼可以設定這個屬性.
  7. secure:是否是安全的,如果設定為True,那麼只能在https協議下才可用。
  8. httponly:預設是False。如果為True,那麼在客戶端不能通過JavaScript進行操作。

  獲取cookie:

  通過request.COOKIES來獲得。這個物件是一個字典型別

  刪除cookie:

  通過delete_cookie("username")來刪除cookie,實際上是把cookie的值設定為空額字串,然後把過期時間設定為0;關閉瀏覽器自然就刪除了

cookie程式碼例項

from django.http import HttpResponse  
from datetime import datetime
from django.utils.timezone import make_aware  
def index(request):   #設定cookie
    response = HttpResponse("ok")
    expires = datetime(year=2019,month=12,day=20,hour=0,minute=0,second=0)
    expires = make_aware(expires)
    response.set_cookie("username","abc",max_age=190,expires = expires,path="/cms/")
    return  response

def delete_cookie(request):    #刪除cookie
    response = HttpResponse("delete")
    response.delete_cookie("username")
    return response

def cookie_list(request):   #獲取cookie
    cookies = request.COOKIES   
    username = cookies.get("username")
    return  HttpResponse(username)

 

django中session的設定:

session常用的方法如下:

  1. get:用來從session中獲取指定值。

  2. pop:從session中刪除一個值。

  3. keys:從session中獲取所有的鍵。

  4. items:從session中獲取所有的值。

  5. clear:清除當前這個使用者的session資料。 從瀏覽器中刪除,不會刪除資料庫的中

  6. flush:刪除session並且刪除在瀏覽器中儲存的session_id,一般在登出的時候用得比較多。 直接刪除資料庫中的

  7. set_expiry(value):設定過期時間。

    1. value可以是整形代表秒數,多少秒後過期
    2. 可以是0,關閉瀏覽器就過期
    3. 可以是None,會使用全域性的session配置。在settings.py中可以設定SESSION_COOKIE_AGE來配置全域性的過期時間。預設是1209600秒,也就是2周的時間
  8. clear_expired:清除過期的sessionDjango並不會清除過期的session,需要定期手動的清理,或者是在終端,使用命令列python manage.py clearsessions來清除過期的session

from datetime import  timedelta
def session_list(request):
    # request.session["username"] = "username"     #新增session
    # username = request.session.get('username')    #獲取session
    # print(username)
  request.session.clear() #刪除session_id 不會刪除資料庫中的資料
  request.session.flush() #暴力刪除資料庫中的資料一起刪除

  request.session.clear_expired() #清除過期的session expiry = timedelta(days=2) request.session.set_expiry(None) return HttpResponse("ok")