基于类的视图的实例变量是否持久?

use*_*806 5 python django django-class-based-views django-1.4

我刚开始在django中使用基于类的视图.但是有一个问题让我感到困惑.我使用带有多线程开发服务器的django 1.4.1运行以下代码片段.

class TestView(TemplateView):
    template_name = 'test.html'
    count = 0
    mylist = [1, ]

    def get(self, request, *args, **kwargs):
        self.count += 1
        self.mylist.append(self.mylist[-1] +1)
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

    def get_context_data(self, **kwargs):
        context = super(TestView, self).get_context_data(**kwargs)
        context['count'] = self.count
        context['mylist'] = self.mylist
        return context
Run Code Online (Sandbox Code Playgroud)

模板只输出上下文变量count和mylist.调用此视图时,例如最多5次,输出将如下所示:

count: 1
mylist: [1, 2, 3, 4, 5, ]
Run Code Online (Sandbox Code Playgroud)

而现在我很困惑.django docs说,每个请求都有自己独立的类实例.

那么如何在几个请求中扩展mylist呢?为什么count变量没有递增?

jdi*_*jdi 1

列表是可变的。整数是不可变的

您可以追加到列表中,它仍然是您班级中的相同参考。但是当你这样做时self.count += 1,你每次都会创建一个新的 int 对象,它成为该实例的范围。该值永远不会影响类。

例如,如果您这样设置:

count = [0]

def get(self):
    self.count[0] += 1
Run Code Online (Sandbox Code Playgroud)

您会发现实例之间的计数会增加,因为您正在修改列表的成员,而不是每次都替换该对象。并不是说我推荐那个容器。只是一个例子。

您可以通过执行以下操作来直接修改该类:

count = 0

def get(self):
    self.__class__.count += 1
Run Code Online (Sandbox Code Playgroud)

这将每次替换类级别的 int 对象。

但我会非常小心地尝试在这样的线程之间保留类上的数据。它不是线程安全的。只读数据实际上并没有问题,但从一堆不同的线程更改它可能会出现问题。如果将数据存储在数据库中会好得多。