Я пытаюсь записать "штату только" декоратора для Django, но я, может казаться, не заставляю его работать:
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
Попытка последовать примеру отсюда. Я добираюсь:
'WSGIRequest' object has no attribute '__name__'
Но если я провожу те 3 строки, я просто получаю бесполезную "Внутреннюю Ошибку Сервера". Что я делаю неправильно здесь?
Этот декоратор уже существует как
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
Этот стиль функции декоратора используется с параметризованным декоратором - например, когда вы это делаете:
@staffonly(my_arguments)
def function(request):
blah
Если вы на самом деле не вызываете внешнюю функцию, т.е. вы используете ее следующим образом:
@staffonly
def function(request):
Вы получите нечетное результаты, поскольку объект функции будет передан не той из вложенных функций в декораторе.