Django:工作室装饰员

mpe*_*pen 51 django decorator

我正在尝试为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
Run Code Online (Sandbox Code Playgroud)

试图从这里跟随铅.我越来越:

'WSGIRequest' object has no attribute '__name__'

但是,如果我把这3行删除,我只会得到一个无用的"内部服务器错误".我在这做错了什么?

Mar*_*vin 151

这个装饰器已经存在了

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

@staff_member_required
Run Code Online (Sandbox Code Playgroud)

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

  • @Mark:卢克是......卢克天行者!Obi Wan Kenobi(http://en.wikipedia.org/wiki/Obi-Wan_Kenobi)就是那个说"卢克!用户来源!"的人.在星球大战IV(这实际上是第一部电影).装饰器通常只接受一个参数,即要装饰的函数.如果您需要添加更多args,请查看教程.(例如http://www.artima.com/weblogs/viewpost.jsp?thread=240845)如果当前的装饰者没有做你需要的,*复制它*并改变它!这是开源的本质. (7认同)

Mar*_*ian 12

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

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):
    ...
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 11

这种样式的装饰器功能与参数化装饰器一起使用 - 例如当你这样做时:

@staffonly(my_arguments)
def function(request):
    blah
Run Code Online (Sandbox Code Playgroud)

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

@staffonly
def function(request):
Run Code Online (Sandbox Code Playgroud)

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