登陸驗證系統實例-三種(cookie,session,auth)


登陸驗證

  因為http協議是無狀態協議,但是我們有時候需要這個狀態,這個狀態就是標識

  前端提交from表單,后端獲取對應輸入值,與數據庫對比,由此對象設置一個標識,該對象

在別的視圖的時候,有此標識,可以訪問,沒有則讓其去登陸

  所以,cookie,session應運而生

 

一,cookie驗證流程

1 cookie
2 客戶端(瀏覽器)第一次請求登陸頁面的時候,攜帶的cookie是空,響應頁面也沒有給cookie設置    
3 提交form 表單的時候,攜帶的cookie是空,服務器去判斷,有這個用戶,設置了cookie    
4 跳轉到首頁攜帶了cookie
5 刪除cokkie
6 response.delete_cookie("cookie_key",path="/",domain=name)

設置cookie

 1 login 函數視圖
 2 user=UserInfo.objects.filter(username=user,password=pwd).first()
 3 
 4 if user:
 5     obj=redirect("/index/")
 6     obj.set_cookie("is_login",True,path='/',max_age=10,expires=10)
 7     # cookie 參數
 8     # def set_cookie(self, key, 鍵
 9     #               value = '', 值
10     #              max_age = None, 超長時間
11     #              expires = None, 超長時間
12     #              path = '/', Cookie生效的路徑,
13     # 瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將
14     # cookie傳給站點中的其他的應用。
15     # / 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
16     obj.set_cookie("username",user.username)
17     return obj
18 
19 index 函數視圖
20 ret=request.COOKIES.get('is_login')
21 if ret: 
22     return render(request,"index.html")
23 return redirect("/login/")

 

二,cookie+session驗證流程

1 cookie + session
2 與cookie 相同
3 只是cookie保存的是 session_id:隨機字符串  客戶端
4 隨機字符串,data 以鍵值對方式保存在 django_session里面  服務器
5 跳轉首頁去跟服務器django_session去拿值
6 刪除 session
7 可以刪除 del request.session['is_login'] 這也只是在django_session里面的data里面刪除這個鍵值對
8 還可以 這樣 request.session.flush() 這樣是刪除django_sesssion里面的一條記錄

設置session

 1 login 函數視圖
 2 user=UserInfo.objects.filter(username=user,password=pwd).first()
 3 
 4 if user:
 5     # 注意這里設置 session
 6      request.session["Is_login"]=True
 7      return redirect("/index/")
 8 
 9 
10 index 函數視圖
11 ret=request.session.get('is_login')
12 if ret: 
13     return render(request,"index.html")
14 return redirect("/login/")

 

三,auth驗證流程

1 auth
2 與cookie 相同
3 隨機字符串,data 以鍵值對方式保存在 django_session里面   客戶端
4 跳轉首頁去跟服務器django_session去拿值    服務器
5 auth 模塊有自己的驗證機制,通過  
6    auth.authenticate(username=user,password=pwd)  匹配驗證
7    auth.login(request,user)                 設置session
8    request.is_authenticated()           是否通過驗證,返回true,false
9    auth.logout(request)           刪除django_session一條記錄

 

auth驗證  ,httprequest.user

 1 HttpRequest.user
 2 
 3   一個 AUTH_USER_MODEL 類型的對象,表示當前登錄的用戶。
 4 
 5   如果用戶當前沒有登錄,user 將設置為 django.contrib.auth.models.AnonymousUser 的一個實例。你可以通過 is_authenticated() 區分它們。
 6 
 7     例如:
 8 
 9     if request.user.is_authenticated():
10         # Do something for logged-in users.
11     else:
12         # Do something for anonymous users.
13 
14     user 只有當Django 啟用 AuthenticationMiddleware 中間件時才可用。

 

auth驗證 實際例子(登陸,注冊,更改密碼)

注意,from表單里面不應該有button按鈕,會當成數據提交

 1 from django.contrib.auth.models import User
 2 from django.contrib import auth
 3 def login(request):
 4     if request.method == "POST":
 5         user = request.POST.get("user")
 6         pwd = request.POST.get("pwd")
 7         # django 利用自身auth_user表驗證,去表里匹配
 8         user=auth.authenticate(username=user,password=pwd)
 9         if user:
10             # 驗證通過,會記錄在 djangos_session 表里面一條記錄 給某個已認證的用戶附加上session id
11             auth.login(request,user) #  設置session cookie記錄 session_id:隨機字符串 django_session 隨機字符串:session_data
12             return redirect("/index/")
13 
14     return render(request, "login.html")
15 
16 def index(request):
17     user=request.user  #  顯示當前登錄用戶對象
18 
19     if not user.is_authenticated(): #  是否通過驗證
20          return redirect("/login/")
21 
22     name=request.user.username
23     return render(request,"index.html",{"name":name})
24 
25 def log_out(request):
26     '''
27     注銷
28     :param request: 
29     :return: 
30     '''
31     auth.logout(request)  #  request.session.flush()
32     return redirect("/login/")
33 
34 
35 def reg(request):
36     if request.method == "POST":
37         user = request.POST.get("user")
38         pwd = request.POST.get("pwd")
39 
40         user=User.objects.create_user(username=user,password=pwd) #  創建用戶信息
41         return redirect("/login/")
42 
43     return render(request,"reg.html")
44 
45 def setpwd(request):
46     '''
47     更改 密碼 ###########
48     :param request: 
49     :return: 
50     '''
51     if request.method == "POST":
52         user = request.POST.get("user")
53         pre_pwd = request.POST.get("pre_pwd")
54         new_pwd = request.POST.get("new_pwd")
55         repeat_pwd = request.POST.get("repeat_pwd")
56         # 沒有判斷輸入新密碼2次是否一樣
57         user=auth.authenticate(username=user,password=pre_pwd)
58         # 更改密碼   #############################
59         if user:
60             user.set_password(new_pwd)
61             user.save()
62             return redirect("/login/")
63 
64     return render(request,"setpwd.html")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM