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?
Ce décorateur existe déjà
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
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.
Pour Class Based View s, vous pouvez décorer la méthode de répartition de la classe de vue, comme ceci:
from Django.contrib.admin.views.decorators import staff_member_required
from Django.utils.decorators import method_decorator
@method_decorator(staff_member_required, name='dispatch')
class ExampleTemplateView(TemplateView):
...