我试图为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行去掉,我只会得到一个无用的“内部服务器错误”。我在这里做错了什么?
4条答案
按热度按时间elcex8rz1#
此装饰器已存在,作为
行李箱:http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/views/decorators.py
b1uwtaje2#
对于基于类的视图,可以如下修饰视图类的调度方法:
piv4azn73#
这种风格的装饰器函数与参数化的装饰器一起使用--例如,当您执行以下操作时:
如果你不是真的调用外部函数,即你是这样使用它的:
您将得到奇怪的结果,因为函数对象将被传递给装饰器中的一个错误的嵌套函数。
owfi6suc4#
我使用你的装饰,我面临的只有一个错误:-
此错误来自此处
if u.is_authenticated() and u.is_staff:
我将u.is_authenticated()
更改为u.is_authenticated
,它对我很有效