【问题标题】:How to add/modify an attribute to a Django class based view from a Decorator?如何从装饰器向基于 Django 类的视图添加/修改属性?
【发布时间】:2014-05-19 04:14:20
【问题描述】:

我有一个基于类的 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

但在装饰器中,我无法访问被装饰方法的“self”实例。 如何获取该实例并将名为 request 的属性附加到它,以便我可以在该实例的其他方法中使用该属性?

【问题讨论】:

  • 我在下面回答了,但您知道self.request 已经在基于类的视图中为您创建了吗?见here
  • 没有。我一点头绪都没有。谢谢!但是我需要将其他参数添加到 self 作为属性。
  • 我很确定你做错了。以我的经验,覆盖dispatch 几乎从来都不是正确的策略。此外,在处理基于类的视图时,考虑使用 mixin 通常是个好主意。你到底想达到什么目的?

标签: python django django-class-based-views python-decorators


【解决方案1】:

method_decorator 的目的是convert a function decorator into a 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2017-03-08
    • 1970-01-01
    • 2020-07-07
    • 2011-08-29
    • 1970-01-01
    • 2014-10-20
    • 2019-11-02
    相关资源
    最近更新 更多