Django - 自定义装饰器 - 参数未填充

Posted

技术标签:

【中文标题】Django - 自定义装饰器 - 参数未填充【英文标题】:Django - custom decorator - parameter unfilled 【发布时间】:2017-03-13 11:24:48 【问题描述】:

我正在尝试创建一个自己的装饰器来检查用户是否满足某些条件(例如user.is_authenticated),如果此条件不成立,他们将被重定向到另一个页面(第二个参数)。

问题是装饰器不起作用,因为它需要另一个参数(视图函数)。

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse


def condition_or_redirect(view_func, condition, redirect_to):
    def wrapped(request, *args, **kwargs):
        if not condition(request.user):
            return HttpResponseRedirect(reverse(redirect_to))
        else:
            return view_func(request, *args, **kwargs)
    return wrapped

那我想用它:

@condition_or_redirect(lambda x: not x.is_authenticated,'homepage')
def some_view....

代码有什么问题?我知道它想要的第一个参数是 view_func 但我认为它是由装饰器本身添加的。

【问题讨论】:

【参考方案1】:

当你想给一个装饰器传递参数时,你需要定义第三层嵌套;第一级接受参数并返回第二级,它接受函数本身。所以:

def condition_or_redirect(condition, redirect_to):
    def wrapper(view_func):
        def wrapped(request, *args, **kwargs):
            if not condition(request.user):
                return HttpResponseRedirect(reverse(redirect_to))
            else:
                return view_func(request, *args, **kwargs)
        return wrapped
    return wrapper

【讨论】:

以上是关于Django - 自定义装饰器 - 参数未填充的主要内容,如果未能解决你的问题,请参考以下文章

Django 自定义装饰器 - 函数没有属性 get

菊花链 Python/Django 自定义装饰器

怎么在Python装饰器中自定义功能呢?用这种方法让你“为所欲为”

怎么在Python装饰器中自定义功能呢?用这种方法让你“为所欲为”

Django自定义装饰器

Django 自定义视图装饰器