django自定義實現登錄驗證
- django內置的登錄驗證必須讓開發者使用django內置的User模塊,這會讓開發者再某些方面被限制住
- 下面的模塊是我自己自定義實現的django驗證,使用方式和django的一樣
-
1 from django.http import HttpResponse 2 from django.shortcuts import redirect 3 from django.conf import settings 4 from django.views import View 5 6 7 class HttpResponseUnauthorized(HttpResponse): 8 status_code = 401 9 10 11 def login(request, user): 12 request.session['login'] = user.id 13 14 15 def logout(request): 16 request.session.flush() 17 18 19 def login_required(func): 20 """ 21 對需要登錄的視圖函數進行驗證 22 @login_required 23 def your_view(request, *args, **kwargs): 24 '''''' 25 """ 26 27 def wrapper(*args, **kwargs): 28 request = args[0] 29 is_login = request.session.get('login') 30 31 if not is_login: 32 redirect_url = '%s?next=%s' % (settings.LOGIN_URL, request.path) 33 return redirect(redirect_url) 34 else: 35 result = func(*args, **kwargs) 36 return result 37 38 return wrapper 39 40 41 class LoginRequired(View): 42 """ 43 對需要登錄的類視圖進行驗證 44 class YouView(LoginRequired): 45 '''''' 46 """ 47 48 @classmethod 49 def as_view(cls, **initkwargs): 50 view = super(LoginRequired, cls).as_view() 51 return login_required(view)
- 當驗證用戶名密碼成功后,使用login登入一個用戶,將request,和登錄后的user對象(model的實例)傳進去, 即可記錄下當前用戶的登錄狀態
- 退出用戶直接將session清除即可。
- 對於函數視圖,用裝飾器對函數視圖進行裝飾:
-
- 判斷當前的請求request里面的session有沒有被login生成一個key為'login'的值:
-
- 如果沒有則跳轉到登錄頁面
- 有則進行正常訪問
- 類視圖調用的是as_view方法,可以在urls里面對該url對應的類視圖的as_view用login_required進行調用,這種方法比較繁瑣,代碼可讀性查
- 對於類視圖,因為類視圖最后都要調用as_view方法,可以重新寫一個類來繼承View,重寫View的as_view方法。
-
- 調用父類的as_view方法,將返回的view對象用login_required進行調用,最后實現了類方法的驗證
