如何通过装饰器向Django类视图添加/修改属性?

1 投票
1 回答
1289 浏览
提问于 2025-04-18 01:40

我有一个基于类的Django视图,代码如下:

class myView(TemplateView):
    template_name = 'templateFile.html'
    request = None

    @method_decorator(request_management)
    def dispatch(self, request, *args, **kwargs):
        ...
        return super(myView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, *args, **kwargs):
        ctx = super(newFeatures, self).get_context_data(**kwargs)
        ctx['requester'] = self.requester
        return ctx

在我的request_management装饰器中,我想把myView.request的值设置为传递给dispatch函数的参数。所以我这样做:

def request_management(function):
    @wraps(function)
    def decorator(*args, **kwargs):
        logger.debug("request = %s" % str(args[0]))
        # I want to say here something like: 
        # self.request = args[0]
        # but of course, "self" is not defined in this context.
        return function(*args, **kwargs)
    return decorator

但是在装饰器内部,我无法访问被装饰方法的“self”实例。我该如何获取这个实例,并给它添加一个名为request的属性,这样我就可以在这个实例的其他方法中使用这个属性了呢?

1 个回答

2

method_decorator的作用是将一个函数装饰器转换成方法装饰器。简单来说,就是让你可以把一个普通的装饰器用在类的方法上。不过,因为你自己在写装饰器,所以你可以直接把它写成一个真正的方法装饰器,这样更简单直接:

class myView(TemplateView):

    @request_management
    def dispatch(self, request, *args, **kwargs):
        ... 
        return super(myView, self).dispatch(request, *args, **kwargs)

    def request_management(method): 
        @wraps(method)
        def decorator(self, request, *args, **kwargs):
            logger.debug("request = %s" % str(request))
            self.request = request

            return method(self, request, *args, **kwargs)

        return decorator

撰写回答