前言
大家應該都遇到過,在某些頁面中,我們不希望匿名用戶能夠訪問,例如個人頁面等,這種頁面只允許已經登錄的用戶去訪問,在django中,我們也有比較多的方式去實現。
最簡單的,我們在viewz中去判斷用戶is_authenticated,但這種方法也相對比較笨拙,最理想的的我們當然不希望這個請求能夠進入到我們view,在這之前就能夠返回一個相關的response,而django其實已經給我們封裝好了相關的函數與類。下面話不多說了,來一起看看詳細的介紹吧。
基于fbv模式的login_required裝飾器
def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None): # 實際上這個方法也是調用is_authenticated去判斷 pass
使用方法也很簡單:
# fbv模式from django.contrib.auth.decorators import login_required@login_required def user_info_view(request): # 用戶個人界面 pass
那么,我們希望如果是匿名用戶在訪問這個界面后能夠重定向到login界面,我們可以設置相關參數,login_required裝飾器會默認去讀取settings.LOGIN_URL,并重定向到這個頁面,如果希望更為靈活,那么我們也可以給裝飾器傳相關參數。
# fbv模式@login_required(login_url='/login/', redirect_field_name='next')def user_info_view(request): # 用戶個人界面 pass
login_url就是匿名用戶訪問后重定向的url,一般都是login的頁面
redirect_field_name是一個get請求的參數
假設當前頁面會/user/info/
那么重定向的url為: /login/?next=/user/info/
這個參數可以用于登陸后直接跳轉回這個頁面,后面還會具體介紹!
基于cbv的LoginRequiredMixin類
博主一般常用都是cbv模式,在這個模式下,我們會重寫get和post方法,理論上可以用login_required裝飾器去裝飾這兩個方法
# cbv模式from django.contrib.auth.decorators import login_requiredfrom django.utils.decorators import method_decoratorclass UserInfoView(View): @method_decorator(login_required(login_url='/login/', redirect_field_name='next')) def get(self, request): # 獲取用戶個人界面 pass
login_required是函數裝飾器,method_decorator可以將函數裝飾器轉化成方法裝飾器。如果這里還有post請求,那這樣的代碼我們還要在寫一遍,這樣就顯得有點冗余,我們既然用了類來實現,當然通過類的優勢來實現!繼承LoginRequiredMixin!
from django.contrib.auth.mixins import LoginRequiredMixinclass UserInfoView(LoginRequiredMixin, View): def get(self, request): # 獲取用戶個人界面 pass
那么,LoginRequiredMixin是怎么去實現的呢?
新聞熱點
疑難解答