我有两个装饰器功能 - authenticate
和authenticate_remote
。此时我必须以这种方式依次使用它们:
@authenticate
def view_local(request):
...
@authenticate_remote
def view_remote(request):
...
其中view_local
和view_remote
的代码完全相同。我想要的是:
@authenticate or @authenticate_remote
def view_one(request):
...
在这种情况下,我不必过多地复制粘贴并在此处克隆类似的代码。
答案 0 :(得分:2)
以下是我要做的事情:
def view_one(request):
# common code
view_local = authenticate(view_one)
view_remote = authenticate_remote(view_one)
它简单明了,并且保留了urls
模块的逻辑。
答案 1 :(得分:1)
装饰器是接收函数并通常返回相同函数的callables。所以很遗憾你不能对装饰器执行布尔操作。
话虽如此,有一些可行的方法可以做到:
您可以在authenticate(view_one)
中使用符号authenticate_remote(view_one)
和urls.py
(也可以使用@jonrsharpe的评论)。
如果由于某些原因对我不太深刻,你有一些复杂的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
最后,您始终可以提供自己的装饰器,在提供的功能上同时使用其他两个装饰器,然后在view_one
上使用该装饰器。