python - 为什么我的 Django View 装饰器没有收到传递给它的请求?

标签 python django decorator

我有一个看起来像这样的设置:

def foo_decorator(function):
    @wraps(function)
    def decorator(*args, **kwargs):
        print kwargs
        return function(*args, **kwargs)

    return decorator

@foo_decorator
def analytics(request, page_id, promotion_id):
    pass

输出:

{'promotion_id': u'11','page_id': u'119766481432558'}

为什么我的装饰器没有将 request 传递给它?

最佳答案

request 不是 View 的关键字参数,它是第一个位置参数。您可以作为 args[0] 访问它。

def foo_decorator(function):
    @wraps(function)
    def decorator(*args, **kwargs):
        print args[0]
        return function(*args, **kwargs)

    return decorator

我建议您更改函数签名以显式包含 request:

def foo_decorator(function):
    @wraps(function)
    def decorator(request, *args, **kwargs):
        print request
        return function(request, *args, **kwargs)

    return decorator

关于python - 为什么我的 Django View 装饰器没有收到传递给它的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9397584/

相关文章:

python - 如何使用分发 python 安装用户特定的配置文件

python - 是否可以使用带参数的 Python 类装饰器?

python - Django - 在 Formset 中禁用对现有表单的编辑,但允许在新表单中进行编辑

java - 带有装饰器的设计模式

Javascript 装饰器模式 - 原型(prototype)还是单一函数?

python - Scrapy - 使用 JOBDIR 获取重复项

python - {{ form }} 标签如何在 Django 注册应用程序中工作

python 如何将一个类的实例变量获取到另一个类?

django - 在反向关系上具有多个 Sum 聚合的不同值

django - 为什么 django 设置不应在运行时更改?