2012-01-15 45 views
2

在我的Django项目,我通常测试,如果视图被称为是正确使用:Django的测试返回_wrapped_view作为视图名称,而不是正确的视图名称

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) 

当我申请这个装饰始终是“_wrapped_view”

我怎样才能使视图名称回到正常的的resolve(response.request["PATH_INFO"])[0].func_name结果呢?

感谢

回答

3

您可以在装饰用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) 
+0

感谢您的快速响应!它非常完美! – duduklein 2012-01-15 13:28:00