我正在尝试为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
尝试follow lead from here。我得到了:
'WSGIRequest' object has no attribute '__name__'
但是,如果我把这3行删除,我只会得到一个无用的“内部服务器错误”。我在这里做错了什么?
答案 0 :(得分:143)
此装饰器已作为
存在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
答案 1 :(得分:11)
这种装饰器功能与参数化装饰器一起使用 - 例如当你这样做时:
@staffonly(my_arguments)
def function(request):
blah
如果您实际上没有调用外部函数,即您正在使用它:
@staffonly
def function(request):
你会得到奇怪的结果,因为函数对象将被传递给装饰器中错误的一个嵌套函数。
答案 2 :(得分:10)
对于基于类的视图,您可以装饰视图类的调度方法,如下所示:
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):
...