我正在尝试为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
尝试跟从这里的示例: http://passingcuriosity.com/2009/writing-view-decorators-for-django/,但是遇到以下错误:
'WSGIRequest' object has no attribute '__name__'
如果我将这3行代码删除,只会得到一个无用的"Internal Server Error"。我在这里做错了什么?
django/contrib/admin/views/decorators.py
(1.1.1版本中的第26行)中,你会找到这个函数,在第71行你会看到if user.is_active and user.is_staff:
,它决定了赞/踩的结果。这个特定的装饰器比普通的要复杂一些的唯一原因是它可能会触发一个登录序列作为副作用。如果你需要它做更多的事情(例如不同的错误消息),你可以复制一份然后在适当的地方调用你自己的装饰器。 - Peter Rowell