簡體   English   中英

如何將兩個裝飾器之一應用於視圖

[英]How to apply either of two decorators to a view

我有兩個裝飾器函數authenticateauthenticate_remote 此時,我必須以這種方式依次使用它們:

@authenticate
def view_local(request):
    ...

@authenticate_remote
def view_remote(request):
    ...

其中view_localview_remote具有完全相同的代碼。 我想要的是這樣的:

@authenticate or @authenticate_remote
def view_one(request):
    ...

在這種情況下,我不必復制太多的粘貼內容,而在這里和那里克隆相似的代碼。

這是我會做的:

def view_one(request):
    # common code

view_local = authenticate(view_one)
view_remote = authenticate_remote(view_one)

它很簡單,明確,並且使邏輯不包含在urls模塊中。

裝飾器是可調用的函數,它們接受一個函數並經常返回相同的函數。 因此,不幸的是,您無法對裝飾器執行布爾操作。

話雖如此,有一些可能的事情可以做:

  1. 您可以在urls.py使用表示法authenticate(view_one)authenticate_remote(view_one) (也請@jonrsharpe評論)。

  2. 如果由於某種原因對我來說不深,您有一些復雜的urls.py ,但您不能這樣做,則可以繼續使用帶有修飾符的兩個函數,兩個都指向具有通用代碼的第三個函數,從而避免重復:

     @authenticate def view_local(request): view_one(request) @authenticate_remote def view_remote(request): view_one(request) def view_one(request): # common code 
  3. 最后,您始終可以提供自己的裝飾器,該裝飾器在提供的函數上同時使用其他兩個裝飾器,然后在view_one上使用該裝飾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM