60 votes

Django: Décorateur du personnel

J'essaie d'écrire un décorateur "personnel uniquement" pour Django, mais je n'arrive pas à le faire fonctionner:

 def staff_only(error='Only staff may view this page.'):
    def _dec(view_func):
        def _view(request, *args, **kwargs):
            u = request.user
            if u.is_authenticated() and u.is_staff:
                return view_func(request, *args, **kwargs)
            messages.error(request, error)
            return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('home')))
        _view.__name__ = view_func.__name__
        _view.__dict__ = view_func.__dict__
        _view.__doc__ = view_func.__doc__
        return _view
    return _dec
 

Essayer de suivre l'exemple d'ici . Je suis en train:

'WSGIRequest' object has no attribute '__name__'

Mais si je retire ces 3 lignes, je reçois juste une "erreur de serveur interne" inutile. Qu'est-ce que je fais mal ici?

167voto

Mark Lavin Points 12740

Ce décorateur existe déjà comme

 from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
 

Tronc: http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/views/decorators.py

11voto

Daniel Roseman Points 199743

Ce style de fonction de décorateur est utilisé avec un décorateur paramétré - par exemple lorsque vous faites:

 @staffonly(my_arguments)
def function(request):
    blah
 

Si vous n'appelez pas réellement la fonction externe, c'est-à-dire que vous l'utilisez comme ceci:

 @staffonly
def function(request):
 

Vous obtiendrez des résultats étranges, car l'objet fonction sera passé à la mauvaise des fonctions imbriquées dans le décorateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X