了解Django中的装饰器

时间:2018-08-08 18:06:53

标签: python django

我目前正在尝试为基于函数的视图构建自己的装饰器。

我了解装饰器背后的基本概念,但我仍在努力充分理解“幕后”的情况。

我有这个示例装饰器。有人可以解释一下这里发生了什么或如何运作?为什么我们在这里需要这么多功能?

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

1 个答案:

答案 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...>

这可以扩展到更复杂的情况,例如装饰器接受自己的论点,但我认为这些细节不是您问题的根源。再次要强调的一点是,装饰器将一个函数作为参数,然后返回一个函数(并且返回的函数几乎总是以某种方式扩展传递的函数)。

希望有帮助。