Django: декоратор штата

Я пытаюсь записать "штату только" декоратора для 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 строки, я просто получаю бесполезную "Внутреннюю Ошибку Сервера". Что я делаю неправильно здесь?

50
задан mpen 22 April 2010 в 08:28
поделиться

2 ответа

Этот декоратор уже существует как

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

@staff_member_required

Транк: http://code.djangoproject.com/browser/django/ ствол / django / contrib / admin / views / decorators.py

149
ответ дан 7 November 2019 в 10:29
поделиться

Этот стиль функции декоратора используется с параметризованным декоратором - например, когда вы это делаете:

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

Если вы на самом деле не вызываете внешнюю функцию, т.е. вы используете ее следующим образом:

@staffonly
def function(request):

Вы получите нечетное результаты, поскольку объект функции будет передан не той из вложенных функций в декораторе.

11
ответ дан 7 November 2019 в 10:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: