1. 程式人生 > 其它 >Django-----cookie&session

Django-----cookie&session

cookie

儲存在使用者瀏覽器端的一個鍵值對(別人給的憑證)

服務端可以向用戶瀏覽器寫cookie

客戶端每次發請求會攜帶cookie去(放在請求頭裡面)

淘寶的cookie 京東的cookie(http的連線很簡單,是無狀態的,為了登入後下次來還認識,也為了避免再次登入)

功能:1.一段時間內免登入 2.瀏覽器自動記住賬號密碼 3.修改每次看的頁數(只用修改一次)

禁用瀏覽器的cookie(無限投票例子)

使用者第一次請求時候後端處理程式碼

def login(request):
    if request.method=="GET":
        return render(request,'
登入介面') else: user=request.POST.get('username') pwd=request.POST.get('password') print(user,pwd) if user=='akagi' and pwd== '521': obj=redirect('使用者後臺') #obj.set_cookie('ticket','sdfasdas',max_age=10,path='/')#max_age=10 十秒後cookie失效 裡面的path屬性指定這個cookie內容在哪個url生效
obj.set_signed_cookie('ticket','19438',salt='jjjjjj',max_age=10)#cookie加密(簽名)需要做異常處理 解密解密p57 #set_cookie(self, key, value='', max_age=None, expires=None, path='/', # domain=對域名劃分sso, secure=https相關, httponly=安全相關js程式碼無法獲取到, samesite=??): return obj
else: return render(request, '登入介面')
View Code

後端會檢查使用者請求的時候是否帶有相關的cookie,有則通過再做其他操作,無則返回登入介面

def classes(request):
    try:
    #tk=request.COOKIES.get('ticket')  #自定義名字
        tk=request.get_signed_cookie('ticket',salt='jjjjjj')  #=加密時候salt要對應 簽名
    except KeyError:
        return redirect('/login/')
    #print('tk=',tk)
    if not tk:
            return redirect('/login/')
View Code

session(推薦)

儲存在伺服器端的資料(本質是鍵值對)

應用的時候依賴於cookie

作用:保持會話( Web網站)

好處:敏感資訊不會直接給客戶端(cookie容易被偽造,即使簽了名也能被破解,因為資料在瀏覽器端)

原理:使用者請求,返回一串隨機字串,然後服務端也儲存這個隨機字串為key,一個字典為value(裡面可以記錄各種資料)

使用者第一次請求時候後端處理程式碼

def session_login(request):
    if request.method=='GET':
        return render(request,'session.html')
    else:
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        obj=models.UserAdmin.objects.filter(username=u,password=p).first()
        if obj:
            #1.生成隨機字元
            #2.通過cookie發給客戶端
            #3.服務端儲存(隨機字串1,{'username':'qwe',} ;下次驗證兩端各一份)   對應cookie裡面的sessionid
            #(資料,類似鍵值對 放到資料庫表裡面了)
            request.session['username']=obj.username #做三件事123  鍵值對
            request.session['password'] = obj.password
            #隨著增加的鍵值對越多,資料庫session_key不變,session_data變長
            request.session['email'] = '[email protected]'
            request.session.set_expiry(5) #設定失效時間
            # * 如果value是個整數,session會在些秒數後失效(適用於整個Django框架,即這個數值時效時整個頁面都會session失效)。
            #* 如果value是個datatime或timedelta,session就會在這個時間後失效。
            #* 如果value是0,使用者關閉瀏覽器session就會失效。
            #* 如果value是None,session會依賴全域性session失效策略。
            return redirect('/indexxx/')
        else:
            return render(request,'session.html',{'message':'請重新登入'})
View Code

對session驗證

def indexxx(request):
    #1.獲取客戶端cookie種的隨機字串
    #2.去session種查詢有沒有隨機字元
    #3.去session中檢視對應key的value中是否有值
    v=request.session.get('username') #獲取session裡面key為username的value
    s=request.session.session_key
    b=request.session.values()
    print(s)
    if v:
         return  HttpResponse('ok,登入成功:%s---%s----%s' %(v,s,b))
    else:
        return redirect('/session_login/')
View Code

PS:

DJANGO 設定SESSION過期時間

cookie和session的詳解與區別