如何将两个装饰器中的任何一个应用于视图

时间:2015-06-12 15:59:12

标签: python django

我有两个装饰器功能 - authenticateauthenticate_remote。此时我必须以这种方式依次使用它们:

@authenticate
def view_local(request):
    ...

@authenticate_remote
def view_remote(request):
    ...

其中view_localview_remote的代码完全相同。我想要的是:

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

在这种情况下,我不必过多地复制粘贴并在此处克隆类似的代码。

2 个答案:

答案 0 :(得分:2)

以下是我要做的事情:

def view_one(request):
    # common code

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

它简单明了,并且保留了urls模块的逻辑。

答案 1 :(得分:1)

装饰器是接收函数并通常返回相同函数的callables。所以很遗憾你不能对装饰器执行布尔操作。

话虽如此,有一些可行的方法可以做到:

  1. 您可以在authenticate(view_one)中使用符号authenticate_remote(view_one)urls.py(也可以使用@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上使用该装饰器。