2

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

'function' object has no attribute 'get'そして、これはdjango自体の奥深くで例外を引き起こします( /django/core/handlers/base.py line 188)。なぜこれが起こるのか理解できません。何か案は?

4

1 に答える 1

4

これは、デコレータの複雑すぎる (壊れている可能性がある) 実装のように見えます...代わりに、次のようにします。

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

「編集」ビューには、プロジェクトが 2 番目の引数として自動的に含まれるようになったため、次のように変更できることに注意してください。

def edit(request, project):
    #can do stuff with project object in here
于 2012-10-11T13:49:25.657 に答える