Django每次请求都使用相同的类视图实例吗?

时间:2016-10-26 04:06:09

标签: python django

在django中,当使用基于类的视图时,设置类级变量(例如template_name

)是很常见的
class MyView(View):

      template_name = 'index.html'

      def get(self, request):
          ...

我想知道是否在运行时修改这些变量

class MyView(View):

      template_name = 'index.html'

      def get(self, request):
          if some_contrived_nonce_function(): # JUST SO IT ONLY RUNS ONCE
             self.template_name = 'something.html'
          ...

将仅针对该请求(每个请求创建MyView的新实例),或者将持续所有后续请求(使用MyView的相同实例)

2 个答案:

答案 0 :(得分:5)

每个请求都会创建该类的新实例,处理请求并销毁它。基于类的视图的原因不是维护实例,而是允许继承和mixin组合。这使得创建跨多个视图的可重用功能变得非常容易。

您可以在课程的生命周期中的任何位置更改变量。这些变量变得重要的唯一一点是处理请求的时间,特别是在dispatch()方法期间,其他HTTP操作方法如get()post()包装。

我强烈建议您为Classy Class-based Views网站添加书签,因为它可以非常全面地概述基于类的视图的组成方式以及它们的继承方式。在基于类的视图中更改模板名称的最合适方法是覆盖TemplateView上的get_template_names()方法。

class MyView(TemplateView):
    def get_template_names(self):
        if some_contrived_nonce_function():
            return 'something.html'
        else:
            return super(MyView, self).get_template_names()

以上假设您的观点要么继承自TemplateView,要么实施TemplateResponseMixin

答案 1 :(得分:2)

将其修改为:

self.template_name = 'something.html'

肯定只会持续该请求。

将其修改为:

type(self).template_name = 'something.html'

将导致新实例继承您的更改。