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条线,我只是得到一个无用的“内部服务器错误”。 我在这里做错了什么?

这个装饰器已经存在

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

Trunk: http : //code.djangoproject.com/browser/django/trunk/django/contrib/admin/views/decorators.py

这种装饰器函数的风格与参数化的装饰器一起使用 – 例如,当你这样做时:

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

如果你实际上没有调用外部函数,即你正在使用它:

 @staffonly def function(request): 

你会得到奇怪的结果,因为函数对象将被传递给装饰器中错误的嵌套函数。

对于基于类的视图 ,您可以修饰视图类的调度方法,如下所示:

 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): ...