在基于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/

10-11 22:29
查看更多