首页 > 解决方案 > 了解 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

标签: pythondjango

解决方案


理解 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...>

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

希望有帮助。


推荐阅读