登陸驗證
因為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")