【问题标题】:Django: Getting error with arguments in decorator in certain setupDjango:在某些设置中,装饰器中的参数出现错误
【发布时间】:2012-01-18 23:20:28
【问题描述】:

我通常在安装了 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 下运行

【问题讨论】:

    标签: django arguments decorator


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      例如在我的本地机器上 login_required 放在 /media/projects/blablabla/apps/common/utils.py

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

      希望这会有所帮助)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 2019-01-02
        • 2020-09-02
        • 1970-01-01
        • 2021-10-31
        • 2018-09-24
        相关资源
        最近更新 更多