1. 程式人生 > >Django中cookie&session的實現

Django中cookie&session的實現

下一個 lte 用戶服 tde get請求 post atime true 鍵值

1.什麽叫Cookie

Cookie翻譯成中文是小甜點,小餅幹的意思。在HTTP中它表示服務器送給客戶端瀏覽器的小甜點。其實Cookie是key-value結構,類似於一個python中的字典。隨著服務器端的響應發送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。 Cookie是由服務器創建,然後通過響應發送給客戶端的一個鍵值對。客戶端會保存Cookie,並會標註出Cookie的來源(哪個服務器的Cookie)。當客戶端向服務器發出請求時會把所有這個服務器Cookie包含在請求中發送給服務器,這樣服務器就可以識別客戶端了!

Cookie的覆蓋

如果服務器端發送重復的Cookie那麽會覆蓋原有的Cookie,例如客戶端的第一個請求服務器端發送的Cookie是:Set-Cookie: a=A;第二請求服務器端發送的是:Set-Cookie: a=AA,那麽客戶端只留下一個Cookie,即:a=AA。

設置Cookie:

1  1 request.set_COOKIES  

獲取Cookie

 1 request.COOKIES  

刪除cookie:

1 response.delete_cookie("cookie_key",path="/",domain=name)

小實例:

技術分享圖片
 1
def index(request): 2 print("cookie---->""request.COOKIES", request.COOKIES) 3 is_login = request.COOKIES.get("is_login") 4 username = request.COOKIES.get("username") 5 if not is_login: 6 return redirect("/login_cookie") 7 else: 8 return render(request,"
index.html") 9 10 11 def login_cookie(request): 12 if request.method == "POST": 13 info = request.POST 14 user_name = info.get("user") 15 password = info.get("pwd") 16 check_user = models.UserInfo.objects.filter(name=user_name, password=password).first() 17 print(check_user) 18 if check_user: 19 obj = HttpResponse("TRUE") 20 obj.set_cookie("is_login",True) 21 obj.set_cookie("username", user_name) 22 return obj 23 else: 24 return HttpResponse("") 25 else: 26 return render(request,"login.html")
View Code

整個cookie設置流程有三次請求

一共有三次請求
  註意:form表單的action走的路徑還是/login/
     第一次請求:url:http://127.0.0.1:8080/login get請求 //獲取login頁面,此時不帶cookie
     第一次請求:url:http://127.0.0.1:8080/login post請求 user pasw //提交用戶名和密碼,此時不帶cookie,但若認證成功此時在服務端相應會為用戶設置cookie,
     第一次請求:url:http://127.0.0.1:8080/index post請求 攜帶著cookie的了
     所以在index頁面中就會取到cookie,因為這是的index裏面已經有cookie了

cookie存儲到客戶端

優點:數據存儲在客戶端。減輕服務端的壓力,提高網站的性能

缺點:安全性不高,在客戶端很容易被查看或破解用戶會話信息

session

概念:

Session是服務器端技術,利用這個技術,服務器在運行時可以 為每一個用戶的瀏覽器創建一個其獨享的session對象,由於 session為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時 ,可以把各自的數據放在各自的session中,當用戶再去訪問該服務器中的其它web資源時,其它web資源再從用戶各自的session中 取出數據為用戶服務。

基本用法

1、設置session值
    request.session["session_name"]="admin"
2、獲取session值
    session_name = request.session("session_name")
3、刪除session值
    del request.session["session_name"]  刪除一組鍵值對
    request.session.flush()   刪除一條記錄
4、檢測是否操作session值
    if "session_name"  is request.session:
       # 刪除當前用戶的所有Session數據
       

5、get(key, default=None)
  
fav_color = request.session.get(fav_color, red)
  
6、pop(key)
  
fav_color = request.session.pop(fav_color)
  
7、keys()
  
8、items()
  
9、setdefault()
  
  
10 用戶session的隨機字符串
        request.session.session_key
   
        # 將所有Session失效日期小於當前日期的數據刪除
        request.session.clear_expired()
   
        # 檢查 用戶session的隨機字符串 在數據庫中是否
        request.session.exists("session_key")
   
        # 刪除當前用戶的所有Session數據
        request.session.delete("session_key")
   
        request.session.set_expiry(value)
            * 如果value是個整數,session會在些秒數後失效。
            * 如果value是個datatime或timedelta,session就會在這個時間後失效。
            * 如果value是0,用戶關閉瀏覽器session就會失效。
            * 如果value是None,session會依賴全局session失效策略。

Session在Django中的配置

Django默認支持Session,並且默認是將Session數據存儲在數據庫中,即:django_session 表中。
   
a. 配置 settings.py
   
    SESSION_ENGINE = django.contrib.sessions.backends.db   # 引擎(默認)
       
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路徑(默認)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默認)
    SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(默認)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http傳輸(默認)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默認)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否關閉瀏覽器使得Session過期(默認)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請求都保存Session,默認修改之後才保存(默認)

說白了,流程如下圖,瀏覽器在發起請求時,服務器會在Djano session(字段有session_key,session_data)表格中生成一個鍵值隨機數作為 session_key 的值,並且將驗證後的Post發過來的值存入session_data中,並將隨機數作為cookie值返回給瀏覽器,而下一次瀏覽器只要帶著session_key過來就可以找到對應的數據了

技術分享圖片

簡單示例代碼

技術分享圖片
 1 def index_session(request):
 2     print(">>>", request.session.get("is_login"))
 3     print(">>>", request.session.get("username"))
 4     is_login = request.session.get("is_login")
 5     username = request.session.get("username")
 6     if not is_login:
 7         return redirect("/login_session")
 8     else:
 9         return render(request, "index.html")
10 
11 
12 def login_session(request):
13 
14     if request.method == "POST":
15         kepp_str = request.session.get("kepp_str")
16         print("kepp_str--->",kepp_str)
17         if kepp_str.upper() == request.POST.get("validCode").upper():
18             info = request.POST
19             user_name = info.get("user")
20             password = info.get("pwd")
21             check_user = models.UserInfo.objects.filter(name=user_name, password=password).first()
22             print(check_user)
23             if  check_user:
24                 request.session["is_login"] = True
25                 request.session["username"] = user_name
26                 return HttpResponse("200")
27             else:
28                 return HttpResponse("201")
29         else:
30             return HttpResponse("202")
31     else:
32         return render(request,"login.html")
View Code

Django中cookie&session的實現