3

所以我正在尝试为我的 django 视图制作一个装饰器,并且我让它有点工作。装饰器看起来像

# Decorator for the function - update(request, extra=None)
def check_super(view):
    def wrapper(request, *args, **kwargs):
        status = supercheck(request)

        if status=="USER":
            raise PermissionDenied
        else:
            args = [a for a in args]
            kwargs = dict((k, v) for k, v in kwargs.items())
            kwargs.update({'status':status})    # Offending line
            return view(request, *args, **kwargs)

    return wrapper

基本上我使用 supercheck 函数进行检查,我想将结果作为另一个参数传递给我的函数,但上述行导致错误

update() got an unexpected keyword argument 'status'

kwargs 只是一本字典,对吧?所以我应该能够像这样向它添加新的绑定,但它一直给我这个错误。这样做也会导致同样的错误

kwargs['status']=status
4

2 回答 2

2

我不知道你为什么会这样——我无法在我的机器上重现它。

也就是说,做你想做的最简单的方法就是忘记 args 和 kwargs 的麻烦,然后做

else:
    return view(request, *args, status=status, **kwargs)

假设您知道 view需要一个名为“状态”的参数。(如果没有,正如 John Spong 所说,那是你的问题。)

这里有更多关于 *args、**kwargs 和**函数的内容。

也就是说,看起来您要做的就是检查用户是否通过了您的supercheck功能。检查@user_passes_test装饰器- 它完全符合您的要求。

于 2013-11-01T00:18:49.363 回答
0

呸,我想通了。结果我所要做的就是确保原始函数采用 *args 和 **kwargs,这更容易概括(因为我不知道这些函数将如何)

所以我的函数 update() 现在有了签名

update(request, extra=None, *args, **kwargs)

而且我可以在包装之前通过更新 kwargs 来传递“任意”关键字。感谢您的澄清。这些评论帮助我缩小了问题的范围!

唯一需要注意的是,我使用更新功能访问状态

kwargs['status'] 

而不仅仅是

status

这还不错

于 2013-11-01T00:24:27.363 回答