簡體   English   中英

如何從Decorator向基於Django類的視圖添加/修改屬性?

[英]How to add/modify an attribute to a Django class based view from a Decorator?

我有一個基於類的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的值設置為傳遞給調度函數的參數。 所以我做這樣的事情:

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

但是從裝飾器內部,我無法訪問裝飾方法的“自身”實例。 如何獲得該實例並將一個名為request的屬性附加到該實例,以便可以在該實例的其他方法中使用該屬性?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM