Django-----cookie&session
阿新 • • 發佈:2021-06-15
cookie
儲存在使用者瀏覽器端的一個鍵值對(別人給的憑證)
服務端可以向用戶瀏覽器寫cookie
客戶端每次發請求會攜帶cookie去(放在請求頭裡面)
淘寶的cookie 京東的cookie(http的連線很簡單,是無狀態的,為了登入後下次來還認識,也為了避免再次登入)
功能:1.一段時間內免登入 2.瀏覽器自動記住賬號密碼 3.修改每次看的頁數(只用修改一次)
禁用瀏覽器的cookie(無限投票例子)
使用者第一次請求時候後端處理程式碼
def login(request): if request.method=="GET": return render(request,'View Code登入介面') 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 objelse: return render(request, '登入介面')
後端會檢查使用者請求的時候是否帶有相關的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