web-dev-qa-db-ja.com

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行を削除すると、無駄な「内部サーバーエラー」が発生します。ここで何が悪いのですか?

51
mpen

このデコレータはすでに存在します

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

@staff_member_required

トランク: http://code.djangoproject.com/browser/Django/trunk/Django/contrib/admin/views/decorators.py

147
Mark Lavin

このスタイルのデコレータ関数は、パラメータ化されたデコレータで使用されます-たとえば、次の場合:

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

実際に外部関数を呼び出していない場合、つまり次のように使用している場合:

@staffonly
def function(request):

関数オブジェクトがデコレータのネストされた関数の間違った関数に渡されるため、奇妙な結果が得られます。

11
Daniel Roseman

クラスベースビュー sの場合、ビュークラスのディスパッチメソッドを次のように装飾できます。

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):
    ...
11
Mark Chackerian