所以我正在尝试为我的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
答案 0 :(得分:2)
我不知道你为什么会这样 - 我无法在我的机器上重现它。
那就是说,做你想做的最简单的方法就是忘记与args和kwargs的混乱,然后做
else:
return view(request, *args, status=status, **kwargs)
假设您知道 view
接受一个名为'status'的参数。 (如果没有,正如John Spong说的那样,那就是你的问题。)
Here's a bit more on *args, **kwargs, and **
in functions.
也就是说,看起来您要做的就是检查用户是否通过了supercheck
功能。查看@user_passes_test
decorator - 它完全符合您的要求。
答案 1 :(得分:0)
所以我的函数update()现在有了签名
update(request, extra=None, *args, **kwargs)
我可以通过在换行之前更新kwargs来传递“任意”关键字。谢谢你的澄清。这些评论帮助我缩小了问题的范围!
唯一需要注意的是我使用
访问更新功能中的状态kwargs['status']
而不仅仅是
status
哪个不太糟糕