04.Django實現完整登入系統的兩種方法(cookie and session)

Thinkgamer_gyt發表於2015-12-17

一:將登入時的使用者資訊寫入cookie

###############################################################

#一、存取Cookies

#   1、設定Cookies
#       response.set_cookie("cookie_key","value")
#   2、獲取Cookies
#       value = request.COOKIES["cookie_key"]
#   3、刪除Cookies
#       response.delete_cookie("cookie_key",path="/",domain=name)
#   4、檢測Cookies
#       if "cookie_name" is request.COOKIES :
#   5、response.set_cookie() 傳遞一些可選的引數 描述
#       引數      預設值       描述
#       max_age  None  cookies的持續有效時間(以秒計),如果設定為 None cookies 在瀏覽器關閉的時候就失效了。
#       expires  None  cookies的過期時間,格式: "Wdy, DD-Mth-YY HH:MM:SS GMT" 如果設定這個引數,
#                           它將覆蓋 max_age 引數。
#       path      "/"     cookie生效的路徑字首,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣你可以避免將
#                           cookie傳給站點中的其他的應用。
#                           當你的應用不處於站點頂層的時候,這個引數會非常有用。
#       domain      None    cookie生效的站點。你可用這個引數來構造一個跨站cookie。如, domain=".example.com"
#                           所構造的cookie對下面這些站點都是可讀的: www.example.com 、 www2.example.com 和
#                           an.other.sub.domain.example.com 。
#                           如果該引數設定為 None ,cookie只能由設定它的站點讀取。
#       secure      False  如果設定為 True ,瀏覽器將通過HTTPS來回傳cookie。
#二、Cookies規則
#    1、Cookies是以字典方式儲存,(Key—>Value的鍵值對方式儲存),訪問是隻要訪問Session的鍵就可以得到鍵對應的Value
#       如果:value = response.set_cookie("cookie_key","value")
#    2、儲存到客戶端
#       優點:
#           資料存在在客戶端,減輕伺服器端的壓力,提高網站的效能。
#       缺點:
#           1、安全性不高:在客戶端機很容易被檢視或破解使用者回話資訊
##################################################################


def login(request):
    = Member.objects.get(username=request.POST['username'])
    if m.password == request.POST['password']:
        reponse.set_cookie('name',name,3600) #將name寫入瀏覽器cookie,失效時間為3600    
        return HttpResponse("You're logged in.")
    else:
        return HttpResponse("Your username and password didn't match.")
         
def logout(request):
    #清理cookie
    response.delete_cookie('name')
    return HttpResponse("You're logged out.")

二:將登陸時的使用者資訊寫入session表

####################################################################################
# 一、開始Sessions功能:      --正常情況下,你無需任何設定就可以使用session功能。如果你刪除或修改過請檢測一下配置
#      1、編輯settings.py中 MIDDLEWARE_CLASSES 配置, 確保 'django.contrib.sessions.middleware.SessionMiddleware'存在,如果沒有則新增。
#      2、編輯settings.py中INSTALLED_APPS 配置,確保'django.contrib.sessions' (如果你是剛開啟這個應用,別忘了執行 manage.py syncdb )
#
#二、怎麼使用:
#     1、設定Sessions值
#           request.session['session_name'] ="admin"
#     2、獲取Sessions值
#           session_name = request.session["session_name"]
#     3、刪除Sessions值
#           del request.session["session_name"]
#     4、檢測是否操作session值
#           if "session_name" is request.session :
#三、sessions規則:
#     1、session是以字典方式儲存,(Key—>Value的鍵值對方式儲存),訪問是隻要訪問Session的鍵就可以得到鍵對應的Value
#       如果:value = request.session["key_name"]
#     2、Session字典中以下劃線開頭的key值是Django內部保留key值。框架只會用很少的幾個下劃線開頭的session變數,
#       除非你知道他們的具體含義,而且願意跟上Django的變化,否則,最好不要用這些下劃線開頭的變數,它們會讓D
#       jango攪亂你的應用。
#    3、不要用一個新物件來替換掉 request.session ,也不要存取其屬性、
#    4、Session儲存在伺服器端,
#      優點:資料儲存相對比較安全,資料交換方便。
#      缺點:如果儲存資料多,訪問量大時,比較消耗伺服器端資源,導致網站整體效能下降。
####################################################################################


# 建立或修改 session:
request.session[key] = value
# 獲取 session:
request.session.get(key,default=None)
# 刪除 session
del request.session[key] # 不存在時報錯

一個簡化的登陸認證:

def login(request):
    = Member.objects.get(username=request.POST['username'])
    if m.password == request.POST['password']:
        request.session['member_id'= m.id
        return HttpResponse("You're logged in.")
    else:
        return HttpResponse("Your username and password didn't match.")
         
         
def logout(request):
    try:
        del request.session['member_id']
    except KeyError:
        pass
    return HttpResponse("You're logged out.")

相關文章