在基于django的项目中,我有一个带有自定义装饰器的视图:
@login_required
@user_is_project_maintainer
def edit(request, project_key):
...
和实际的自定义装饰器本身:
def user_is_project_maintainer(request):
def decorator(view_func, *args, **kwargs):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(request, project_key, *args, **kwargs):
project = get_object_or_404(Project, key=project_key)
if (project.maintainer_id != request.user.id) :
return HttpResponseRedirect(reverse('kifos.views.index', args=(project.key,)))
else :
view_func(request, *args, **kwargs)
return _wrapped_view
return decorator
这会导致django自身内部(在
'function' object has no attribute 'get'
中)的/django/core/handlers/base.py line 188
异常。无法弄清楚为什么会这样。有任何想法吗? 最佳答案
这看起来像是一个装饰器的过于复杂(可能已损坏)的实现……相反呢:
def user_is_project_maintainer(view):
@wraps(view)
def _wrapped_view(request, project_key, *args, **kwargs):
project = get_object_or_404(Project, key=project_key)
if (project.maintainer_id != request.user.id) :
return HttpResponseRedirect(reverse('kifos.views.index', args=(project.key,)))
else :
view(request, project, *args, **kwargs)
return _wrapped_view
请注意,您的“编辑”视图现在自动将项目作为第二个参数,因此您可以将其更改为:
def edit(request, project):
#can do stuff with project object in here
关于python - 异常'function'对象没有自定义装饰器在Django中触发的属性'get',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12840964/