1. 程式人生 > >Django框架-cookie與session

Django框架-cookie與session

提前 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