我目前正在尝试为基于函数的视图构建自己的装饰器。
我了解装饰器背后的基本概念,但我仍在努力充分理解“幕后”的情况。
我有这个示例装饰器。有人可以解释一下这里发生了什么或如何运作?为什么我们在这里需要这么多功能?
def active_user_required():
def decorator(function):
def wrapper(request, *args, **kw):
if request.user.is_active:
return function(request, *args, **kw)
else:
raise PermissionDenied()
return wrapper
return decorator
答案 0 :(得分:1)
了解Python中装饰器的关键归结为:Python中的函数是一流的对象。这意味着它们可以作为参数传递,也可以作为值返回(除其他外)。
以最简单的形式,装饰器将一个函数作为参数,并返回扩展其功能的新函数。例如,下面是一个装饰器plusone
,它将原始函数的返回值加1:
>>> def plusone(f):
... def wraps(*a):
... return f(*a) + 1
... return wraps
...
>>>
>>> @plusone
... def add(x, y):
... return x + y
...
>>>
>>> add(1, 2)
4
重申一下,关于plusone
的重点不是它“加1”,而是它创建了一个新函数(在这种情况下称为wraps
)并返回那个。在最后一行,当调用add(1, 2)
时,实际上是被调用的函数wraps
(回想起,它调用了原始的add
函数)。您可以证明这一点:
>>> add
<function wraps at 0x107b88578>
(没有装饰器,将显示<function add at 0x...>
)
这可以扩展到更复杂的情况,例如装饰器接受自己的论点,但我认为这些细节不是您问题的根源。再次要强调的一点是,装饰器将一个函数作为参数,然后返回一个函数(并且返回的函数几乎总是以某种方式扩展传递的函数)。
希望有帮助。