Django:员工装饰师

ekqde3dh  于 2022-11-18  发布在  Go
关注(0)|答案(4)|浏览(130)

我试图为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行去掉,我只会得到一个无用的“内部服务器错误”。我在这里做错了什么?

elcex8rz

elcex8rz1#

此装饰器已存在,作为

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

b1uwtaje

b1uwtaje2#

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

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

piv4azn73#

这种风格的装饰器函数与参数化的装饰器一起使用--例如,当您执行以下操作时:

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

如果你不是真的调用外部函数,即你是这样使用它的:

@staffonly
def function(request):

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

owfi6suc

owfi6suc4#

我使用你的装饰,我面临的只有一个错误:-

'bool' object is not callable

此错误来自此处if u.is_authenticated() and u.is_staff:我将u.is_authenticated()更改为u.is_authenticated,它对我很有效

相关问题