1. 程式人生 > >djingo之登陸驗證,cookie,session

djingo之登陸驗證,cookie,session

一:會話技術:

      1:什麼是會話跟蹤技術:

    首先我們應該知道,什麼是會話。當瀏覽器(客戶端)第一次訪問某個網站的時候(伺服器)。該瀏覽器便和伺服器建立了單獨的會話。直到瀏覽器關閉或伺服器斷開。但是一個網站有許多請求,如/login/,/index/等,而http協議是一種無狀態的協議,一次請求一次連結,並不會儲存狀態資訊。而我們一些資訊,常常需要多個請求之間進行互動。既然請求無法儲存登陸資訊,那麼可以使用會話跟蹤技術來儲存資料資訊,進而進行多個請求之間的資料互通。實現會話跟蹤技術就可以使用cookie和session來嗎實現。    

二:cookie

  1:什麼是cookie

    cookie是存在瀏覽器上的一種物件,用於儲存瀏覽器的一些使用者資訊,比如登陸資訊,包括登陸狀態,上一次登陸時間。

      優點:在使用者二次登陸的情況下,可以的快速獲取使用者登陸狀態。

      缺點:因為是儲存在瀏覽器端所以安全性差

        儲存方式:採用鍵值對的方式儲存:{key:value,key:value}

 

  2:djingo的cookie實現

   1:設定cookie  

def  log_in(request):
    if  request.method=='
POST': user = request.POST.get('username') password = request.POST.get('password') if user == 'yjp' and password == 'abc':#登陸驗證成功 obj = redirect('/index') obj.set_cookie('cookie_id','cookie_value')#設定cookie,在瀏覽器儲存{'cookie_id':'cookie_value'}
return obj return render(request, 'login.html', locals())

   2:獲取cook

 

def  index(request):
    co =request.COOKIES.get('cookie_id',None)#根據cooke_id獲取cookie
    if co :
        return render(request, 'index.html')#存在cookie跳轉首頁
    return render(request, 'login.html')#不存在 跳轉登陸頁

瀏覽器第一次請求,攜帶一個空的cookie,伺服器相應的時候,往空的cookie,新增資訊。以後的每次請求都攜帶該cookie.

 

  3:刪除cookie   

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

三:session

  3.1:什麼是session

    session和cookie的作用一樣相似,用來儲存使用者的狀態資訊。通常儲存在伺服器上,對使用者而言,不可見,相對安全。

    儲存方式:使用鍵值對的方式儲存,{key:value,key:value}

    優點:相對於cookie較為安全。

    缺點:通常儲存在資料庫上,每次儲存資料都會進行資料庫的讀取或寫入,影響效率。

     3.2:session實現

def log_in2(request):
  if
request.method=='POST': user = request.POST.get('username') password = request.POST.get('password') if user == 'yjp' and password == 'abc':print('session',request.session) session=request.session session['verfiy'] ='is_login' #設定cookie obj = redirect('/index') return obj return render(request, 'login.html', locals()) def index2(request): co = request.session.get('verfiy', None)#獲取cookie if co == 'is_login': return render(request, 'index.html') return render(request, 'login.html'

四:djingo登陸驗證,auth.利用cookie+session的儲存技術

     4.1:cookie+session儲存過程

          1:瀏覽器第一次傳送請求的時候,傳送一個空的cookie,伺服器此時設定session  如{'user':'yuan'}。

    2:當session設定成功後,伺服器會做兩步操作。一:生成一個隨機字串,並將該字串當作當作session_key,{'user':'yuan'}當作session-data 存在資料庫上。

第二步,生成一個cookie{'session_id':'隨機字串'},返回瀏覽器。

   3:瀏覽器下次傳送請求的時候cookie={'session_id':'隨機字串'},伺服器拿到隨機字串,當作session_key,在資料庫中取出session_data,這樣就完成了session值的傳遞。

 

  4.2:auth驗證的程式碼實現

from django.shortcuts import render,redirect,HttpResponse
import random
from django.contrib import auth        #匯入登陸驗證的模組
# Create your views here.
from django.http import JsonResponse
def index(request):
    if request.user:    #判斷使用者是否存在
        print(request.user)
        return render(request,'index.html')

    else:
        return render(request,'login.html')

def  login(request):
    if  request.method=='GET':
        return render(request,'login.html')
    if request.method=='POST':
        data={'user':None,'msg':None}
        print(request.POST)
        user =request.POST['user']
        pwd =request.POST['pwd']
        code =request.POST['code']
        if  code.lower()==request.session['code'].lower():
            user=auth.authenticate(username=user,password=pwd)#登陸驗證,驗證使用者登陸資訊是否正確,正確返回一個user已經驗證通過的使用者
            if  user:
                auth.login(request,user)#接受一個request物件和通過登陸驗證user,並完成上面三步cookie+session的設定
                data['user']=True
            else:
                data['msg'] = '使用者名稱或密碼錯誤'

        else:
            data['msg']='驗證碼錯誤'

        return JsonResponse(data)
def logout_view(request):
  auth.logout(request)#登出使用者

五:User物件:

  User物件有兩個屬性(user,password)。可以通過request.user.is_authenticated()來驗證使用者登陸是否通過驗證,通過驗證返回true.

驗證後的怎麼操作和該方法無關。該方法只做驗證這一個功能。