简体   繁体   中英

Exception `'function' object has no attribute 'get'` triggered in django by custom decorator

In django based project I have a view with a custom decorator:

@login_required
@user_is_project_maintainer
def edit(request, project_key):
   ... 

and actual custom decorator itself:

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

And this results in an exception 'function' object has no attribute 'get' deep inside django itself (in /django/core/handlers/base.py line 188 ). Can't figure out why this happens. Any ideas?

That looks like an overcomplicated (possibly broken) implementation of a decorator... how about this instead:

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

Note that your "edit" view now automatically has the project as its second argument, so you can change it to:

def edit(request, project):
    #can do stuff with project object in here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM