Django框架-cookie與session
阿新 • • 發佈:2018-09-19
提前 let home man () ase python dex .post
from django.shortcuts import redirect from django.shortcuts import render from login import models # 獲取類才能orm操作庫 """ cookie與session解決登錄驗證 1、models中創建UserInfo類 python manage.py makemigrations login /migrate login --database=login_db 2、urls.py全局中配置app的urls url(r‘^login/$‘, include(‘app_name.urls‘)) from django.conf.urls import url,include 3、在app下的views.py 創建視圖函數 需求:登錄除登錄頁面外,都需要登錄才行!!! 思路: 1、用戶打開頁面,判斷用戶是否登錄,已登錄則直接打開,未登錄則跳到登錄頁面登錄 2、用戶登錄完成後,跳轉到用戶第一次訪問時想要的頁面 3、故實現上步需要提前獲取用戶要訪問的頁面url地址,保存下來 4、用戶第一次登錄時給用戶配置一個cookie設置一個key:value保存狀態""" # 通過cookie解決登錄驗證 # 保存狀態,服務器產生,讓瀏覽器存放在瀏覽器端,一組組鍵值對,4096字節長度,不夠大,不安全 # 校驗登錄裝飾器 def check_login(func): def inner(request, *args, **kwargs): """獲取用戶想訪問的url保存下來,判斷cookie狀態,確認用戶是否登錄""" print(request.path) return_url = request.path_info # 獲取用戶第一次訪問的url,不含域名及參數 #if request.COOKIES.get(‘is_login‘, "") == ‘True‘: # 獲取cookie,比較值,如果符合,說明已經登錄,跳轉到用戶需求頁面 if request.session.get(‘is_login‘, "") == ‘True‘: # session ret = func(request, *args, **kwargs) # 忘了寫request參數,from表單裏忘了{%csrf_token%} else: # 如何不符合跳轉登錄,且將用戶想訪問的url拼接到登錄url後面,博客園就是這麽做的ret = redirect(‘/login/sigin/?ReturnUrl={}‘.format(return_url)) return ret return inner def login(request): """驗證用戶,及配置cookie""" err_msg = "" if request.method == ‘POST‘: username = request.POST.get(‘username‘).strip() password = request.POST.get(‘password‘).strip() # 獲取前端傳過來的用戶名和密碼 if not username or not password: err_msg = "用戶名或密碼不能為空" return render(request, ‘app_login.html‘, {‘err_msg‘: err_msg}) db_select = models.UserInfo.objects.filter(name=username, password=password) if db_select: # 如果正確的話,需要設置cookie相當於一個flag,設置cookie必須時response對象 return_url = request.GET.get(‘ReturnUrl‘, ‘/login/index/‘) # 獲取用戶要訪問的頁面,如果一開始就直接登錄頁面的話,成功後我們設置自動跳到index ret = redirect(return_url) # 跳轉到用戶未登錄前要訪問的頁面 # ret.set_cookie(‘is_login‘, ‘True‘) # 設置cookie以dict形式保存,請求後可以F12查看 request.session[‘is_login‘] = ‘True‘ # session return ret # 就跳到用戶想的要的頁面,否則回到登錄頁面 else: # 用戶名密碼錯誤的話,提示錯誤,還是返回登錄頁面 err_msg = ‘用戶名或密碼錯誤,請重新登錄‘ return render(request, ‘app_login.html‘, {‘err_msg‘: err_msg}) @check_login def logout(request): # 退出就跳到登錄頁面 rep = redirect(to=‘/login/sigin/‘) # rep.delete_cookie(‘is_login‘) request.session.delete() # session的刪除方法 return rep @check_login def index(request): return render(request, ‘app_index.html‘) @check_login def home(request): return render(request, ‘app_home.html‘) # 問題? # 為什麽post請求中可以通過return_url = request.GET.get(‘ReturnUrl‘, ‘/login/index/‘)
Django框架-cookie與session