Django2.1通過中間件session驗證實現登錄驗證功能
Django內置權限管理
Django是有內置的權限管理模塊的,喜歡內置模塊的同學可以使用內置的Auth模塊,官方文檔上有教程的。
Auth需要使用內置的User model,用起來總覺得有點彆扭。不過我們可以參考Auth的源碼,打造一個自定義的登錄驗證模塊,按需定製。
自定義登錄驗證
思路
- 自建User模型
- 編寫登錄函數,登錄成功則存入session
- 編寫中間件,在中間件中驗證session,如不存在session則重定向到登錄頁面
栗子
-
建立 User模型,這個自己隨意,愛咋咋,別給username和password漏了就行。
-
編寫登錄函數
這個登錄函數僅僅是示例,想要更多內容還是自己添加吧。
# 用戶登錄函數
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
md5 = hashlib.md5()
md5.update(password.encode())
password = md5.hexdigest()
info = models.Users.objects.filter(username=username, password=password)
if info:
# 存入session
request.session['key'] = username
return redirect(reverse('登錄成功後要跳轉的頁面'))
else:
return HttpResponse(
"<script>alert('賬號或密碼錯誤,回去吧!');window.location.href='" + reverse('登錄頁別名') + "'</script>")
if request.method == 'GET':
return render(request, '登錄頁')
-
中間件
玩具版中間件
from django.shortcuts import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin
# 自定義中間件類
class UsersAuthMiddleWare(MiddlewareMixin):
def process_request(self, request):
# 獲取session內用戶的登錄標識
key = request.session.get('key', 0)
# 判斷用戶是否登錄,訪問路徑是不是登錄頁面
if key == 0 and request.path != '/login':
# 未登錄,重定向到登錄頁面
return HttpResponseRedirect('/login')
- 定義好中間件別忘了註冊
總結
通過session完成登錄驗證。
數據庫查詢成功則存入正確的session,在中間件中過濾掉非法session。