template - Django: Personal Decorador
import django template (3)
Estoy tratando de escribir un decorador "solo para el personal" para Django, pero parece que no consigo que funcione:
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
Tratando de seguir el liderazgo desde aquí . Me estoy poniendo:
''WSGIRequest'' object has no attribute ''__name__''
Pero si saco esas 3 líneas, solo obtengo un inútil "Error interno del servidor". ¿Qué estoy haciendo mal aquí?
Este decorador ya existe como
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
Tronco: http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/views/decorators.py
Este estilo de función de decorador se usa con un decorador parametrizado, por ejemplo, cuando hace:
@staffonly(my_arguments)
def function(request):
blah
Si no estás llamando a la función externa, es decir, la estás utilizando así:
@staffonly
def function(request):
Obtendrá resultados impares, ya que el objeto de función pasará al incorrecto de las funciones anidadas en el decorador.
Para las Vistas basadas en clase , puede decorar el método de envío de la clase de vista, de la siguiente manera:
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):
...