對LoginRequiredMixin進行重寫

2021-10-20 19:43:36 字數 2798 閱讀 8899

首先我們要知道繼承自loginrequiredmixin的檢視類會怎樣走,未登入,會執行 handle_no_permission函式,登陸了,就直接繼續執行函式下邊的**,如:

class

usercenterinfoview

(loginrequiredmixin, view)

:def

get(self,request)

:return render(request,

"user_center_info.html"

)

未登入,執行handle_no_permission函式,重定向到login_url寫的路由那裡,如果登入了,就什麼也不用管,繼續執行return就行。

再然後,我們要知道為什麼要對loginrequiredmixin進行重寫,我們先看**,下方是原始碼

class

accessmixin

: 略~

~def

handle_no_permission

(self)

:if self.raise_exception or self.request.user.is_authenticated:

raise permissiondenied(self.get_permission_denied_message())

return redirect_to_login(self.request.get_full_path(

), self.get_login_url(

), self.get_redirect_field_name())

class

loginrequiredmixin

(accessmixin)

:"""verify that the current user is authenticated."""

defdispatch

(self, request,

*args,

**kwargs):if

not request.user.is_authenticated:

return self.handle_no_permission(

)return

super()

.dispatch(request,

*args,

**kwargs)

我們發現,在loginrequiredmixin中判斷後,如果未登入,他會呼叫handle_no_permission方法,這個方法在最後會有乙個重定向的操作,加入說,我們在未登入後想要的,是返回乙個json資料的話,這個就很明顯不適合了,這時候就要對他進行重寫。

那麼,問題來了,怎麼重寫呢,在 loginrequiredmixin中,我們能看出來,他進行了判斷,判斷是否登入,這一點我們是需要的,保留下來,判斷裡面就是handle_no_permission函式了,所以我們很容易就能理解,這個dispatch是不用被重寫的,說白了,他就是個判斷的作用,我們的目的肯定不是對判斷進行重寫吧,我們的目的是對返回值進行重寫,所以,我們是需要對handle_no_permission函式進行重寫的,我們再分析下這個函式,看**:

def

handle_no_permission

(self)

:if self.raise_exception or self.request.user.is_authenticated:

raise permissiondenied(self.get_permission_denied_message())

return redirect_to_login(self.request.get_full_path(

), self.get_login_url(

), self.get_redirect_field_name(

))

那個if應該是判斷是否出錯的東西,第二個是判斷是否登入。我們在dispatch中已經判斷過了,所以這個裡面寫不寫if其實沒有多大必要,所以我們只管對return的東西進行重寫就行,我們可以把函式重寫為:

class

loginrequiredjsonmixin

(loginrequiredmixin)

:def

handle_no_permission

(self)

:return jsonresponse(

)

class

loginrequiredjsonmixin

(loginrequiredmixin)

:def

handle_no_permission

(self)

:return jsonresponse(

)def

dispatch

(self, request,

*args,

**kwargs):if

not request.user.is_authenticated:

return self.handle_no_permission(

)return

super()

.dispatch(request,

*args,

**kwargs)

當我們的乙個檢視類繼承自我們重寫的這個loginrequiredmixin後,當檢視類執行時,會先進行判斷是否登入,即,執行dispatch函式,然後就會執行到我們寫的handle_no_permission函式,再然後就會返回出json資料了。

完結撒花,起飛。

只是一點自己的理解,望斧正。

對建立游標對理解

步驟 1 首先經過底層的 編寫已經建立起了了python和資料庫之間的溝通橋梁並封裝成了模組,通過pymysql下的conntent 方法與之建立起了連線,例項物件。pymysql.connect 方法返回的是connections模組下的connection 例項,connect 方法傳參就是在給...

對勾函式 對勾函式

對勾函式是一種類似於反比例函式的一般函式。所謂的對勾函式,是形如 f x ax b x 的函式,是 一種教材上沒有但考試老喜歡考的函式,所以更加要注意和學習。一般的函式影象形似兩個中心對稱的 對勾,故名。當x 0 時,f x ax b x 有最小值 這裡為了研究方便,規定a 0 b 0 也就是當 x...

一對多 多對一

pip install djangorestframework 3.9.2 pip install markdown 3.0.1 markdown support for the browsable api.pip install django filter 2.1.0 filtering supp...