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

Ala*_*ACK 3 python django

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

class MyView(View):

      template_name = 'index.html'

      def get(self, request):
          ...
Run Code Online (Sandbox Code Playgroud)

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

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'
          ...
Run Code Online (Sandbox Code Playgroud)

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

Sov*_*iut 5

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

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

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

class MyView(TemplateView):
    def get_template_names(self):
        if some_contrived_nonce_function():
            return 'something.html'
        else:
            return super(MyView, self).get_template_names()
Run Code Online (Sandbox Code Playgroud)

以上假设您的视图要么继承,TemplateView要么实现TemplateResponseMixin.


don*_*mus 3

将其修改为:

self.template_name = 'something.html'
Run Code Online (Sandbox Code Playgroud)

肯定只会持续该请求。

将其修改为:

type(self).template_name = 'something.html'
Run Code Online (Sandbox Code Playgroud)

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