Тест Django возвращает _wrapped_view в качестве имени представления вместо правильного имени представления - PullRequest
2 голосов
/ 15 января 2012

В моем проекте django я обычно проверяю правильность вызываемого представления, используя:

viewName = resolve(response.request["PATH_INFO"])[0].func_name
self.assertEqual(viewName,'correct_view_name')

Мне удалось сделать это успешно, пока я не добавил декоратор. С тех пор мои представления работают нормально, но я не могу проверить (по крайней мере, вот так) правильное имя представления.

Добавленный мной декоратор выглядит так:

def owner_required(view_func, Model):
    '''
    checks if the object is being accessed but its owner
    '''
    def decorator(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('You don't have access to this page.')
        return _wrapped_view
    return decorator(view_func)

Результат resolve(response.request["PATH_INFO"])[0].func_name, когда я применяю этот декоратор, всегда "_wrapped_view"

Как сделать так, чтобы имя представления вернулось к обычному?

Спасибо

1 Ответ

3 голосов
/ 15 января 2012

Вы можете использовать functools.wraps в вашем декораторе.

try:
    from functools import wraps
except ImportError:
    from django.utils.functional import wraps  # Python 2.4 fallback.
from django.utils.decorators import available_attrs

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('You don't have access to this page.')
        return _wrapped_view
    return decorator(view_func)
...