向装饰器添加参数

pri*_*stc 5 python django decorator

我有这个装饰器,用于装饰django视图,如果share参数是True(由中间件处理)我不希望执行视图

class no_share(object):
    def __init__(self, view):
        self.view = view

    def __call__(self, request, *args, **kwargs):
        """Don't let them in if it's shared"""

        if kwargs.get('shared', True):
            from django.http import Http404
            raise Http404('not availiable for sharing')

        return self.view(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

它目前的工作方式如下:

@no_share
def prefs(request, [...])
Run Code Online (Sandbox Code Playgroud)

但是我想稍微扩展一下这个功能,所以它会像这样工作:

@no_share('prefs')
def prefs(request, [...])
Run Code Online (Sandbox Code Playgroud)

我的问题是如何修改这个装饰器类,以便它接受额外的参数?

Li0*_*liQ 7

我希望布鲁斯·埃克尔的这篇文章有所帮助.

更新: 根据文章,您的代码将如下所示:

class no_share(object):
    def __init__(self, arg1):
        self.arg1 = arg1

    def __call__(self, f):
        """Don't let them in if it's shared"""

        # Do something with the argument passed to the decorator.
        print 'Decorator arguments:', self.arg1

        def wrapped_f(request, *args, **kwargs):
            if kwargs.get('shared', True):
                from django.http import Http404
                raise Http404('not availiable for sharing')
            f(request, *args, **kwargs)            
        return wrapped_f
Run Code Online (Sandbox Code Playgroud)

根据需要使用:

@no_share('prefs')
def prefs(request, [...])
Run Code Online (Sandbox Code Playgroud)