2013-11-01 38 views
3

所以我试图为我的django视图制作一个装饰器,并且我有它的工作。该装饰看起来像向kwargs添加参数时出现错误

# 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 
+2

就是你包裹的功能也称为“更新”。我认为有问题的一行是你在你标记的行下面调用view()的地方。你的第一行注释中的“update”函数不接受称为“状态”的kwarg –

+0

是的,我打包的函数被称为update。我认为像在wrapper()中的return语句中那样传递kwargs的全部要点是我可以为它添加任意参数 –

+1

函数''f(** kwargs)''可以接受任意数量的关键字args,但'update(extra = None)''只需要一个关键字参数。 – CppLearner

回答

0

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

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

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

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

唯一需要注意的是,我进入状态的更新功能与

kwargs['status'] 

,而不是仅仅

status 

这是不是太糟糕

2

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

这就是说,最简单的方法做你想做的是忘了摆弄指定参数和kwargs,只是做

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

假设你知道view采取所谓的“地位”的说法。 (如果没有,约翰司朋说,好,有你的问题。)

Here's a bit more on *args, **kwargs, and ** in functions.

这就是说,它看起来像所有你想要做的是检查用户通过您的supercheck功能。看看@user_passes_test decorator - 它确实是你想要的。

+0

问题是,原始视图不采取“状态”。这就是为什么我试图将它包含在kwargs中,但它似乎并没有让我 –

+1

是的,你不能用kwargs做到这一点 - 你不能随便传递这样的参数。抱歉!也就是说,有一个更简单的方法来做你想做的事 - 检查传入的编辑。 –

相关问题