由於http協議是無狀態協議,可是咱們有時候須要這個狀態,這個狀態就是標識html
前端提交from表單,後端獲取對應輸入值,與數據庫對比,由此對象設置一個標識,該對象前端
在別的視圖的時候,有此標識,能夠訪問,沒有則讓其去登錄數據庫
因此,cookie,session應運而生django
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/")
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/")
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驗證 實際例子(登錄,註冊,更改密碼)cookie
注意,from表單裏面不該該有button按鈕,會當成數據提交session
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")