Django:在某些设置中使用decorator中的参数获取错误

时间:2012-01-18 23:20:28

标签: django arguments decorator

我通常在安装了python 2.6的Ubuntu 10.04机器上工作。我有以下装饰:

def owner_required(view_func, Model):
    '''
    checks if the object is being accessed but its owner
    '''
    def decorator(view_func):
        @wraps(view_func, assigned=available_attrs(view_func))
        def _wrapped_view(request, *args, **kwargs):
            obj = Model.objects.get(pk=int(kwargs['pk']))
            if obj.user == request.user:
                return view_func(request, *args, **kwargs)
            return HttpResponse('Forbidden')
        return _wrapped_view
    return decorator(view_func)

一切都在同一台机器上按预期工作。

当我尝试在我的笔记本电脑上运行它时出现问题,该笔记本电脑有Ubuntu 11.10和python 2.7.2。

无论什么页面,我尝试访问,我收到以下错误:

TypeError: owner_required() takes exactly 1 argument (2 given)

在我的myapp / urls.py中,我有以下行,导致错误:

url(r'^(?P<pk>\d+)/$', name = 'my_view', \
view = owner_required(login_required(\      
DetailView.as_view(model=MyModel,\
template_name='myapp/view.html')),MyModel))

因此,owner_required正在接收2个参数:login_requiredMyModel的结果

可能导致问题的原因是什么?我只给出了我的ubuntu和python版本,因为我不知道还有什么可能导致这个。我应该考虑哪些其他“变量”来解决这个问题?两者都在virtualenv和相同的django版本1.3.1下运行

2 个答案:

答案 0 :(得分:1)

你可能已经尝试过这个,但只是想问一下。当旧的编译视图缓存在服务器中时,我曾经得到类似的错误,尤其是在一些编辑之后,我只需要重新启动服务器。

答案 1 :(得分:0)

要确定使用了owner_required的版本,您可以检查func_code属性。

例如,放在 /media/projects/blablabla/apps/common/utils.py 中的本地计算机login_required上:

login_required.func_code
# <code object login_required at 0x1e75f30, file "/media/projects/blablabla/apps/common/utils.py", line 102>

希望这有帮助)