Django: получение ошибки с аргументами в декораторе при определенной настройке - PullRequest
1 голос
/ 19 января 2012

Я обычно работаю на машине с Ubuntu 10.04, на которой установлен python 2.6. У меня есть следующий декоратор:

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_required и MyModel

Что может быть причиной проблемы? Я даю только свои версии Ubuntu и Python, так как я не знаю, что еще может вызвать это. На какие еще «переменные» я должен смотреть, чтобы решить эту проблему? Оба работают под virtualenv и в одной и той же версии django 1.3.1

Ответы [ 2 ]

1 голос
/ 19 января 2012

Вы, наверное, пробовали это, но просто хотели спросить. Раньше я получал похожую ошибку, когда старое скомпилированное представление кэшировалось на сервере, особенно сразу после некоторых изменений, и все, что мне нужно было сделать, это перезапустить сервер.

0 голосов
/ 19 января 2012

Чтобы выяснить, какая версия 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>

надеюсь, это поможет)

...