首页 > 解决方案 > Django/Python - views.py 中不需要的实例缓存

问题描述

我在 Django 2.1 上运行的页面有问题。我的问题是,当从views.py 调用一个函数来填充模板时,一个类的实例似乎被缓存了。对该函数的每次后续调用/该​​页面的每次刷新都会显示上次调用该页面/函数时的旧数据。

有问题的代码:

projectroot/myapp/templates/myapp/bar.html

#this is bar.html
{{ MyTable.DataColumns }}
<br>
{{ MyTable.DataRows }}

项目根/myapp/views.py

#this is a relevant snippet from views.py
#There isn't anything outside of the functions, 
#with imports being the exception to this rule

import myownpackage.DataTable import DataTable

def list_page(request):
    template = 'foo/bar.html'

    connection = a_connection_here
    query_results = connection.get_query_results(sql_query_here)
    list_of_rows = [x for x in query_results]
    dt = DataTable()
    dt.DataColumns = [list_of_columns_here]
    for each_row in list_of_rows:
        dt.add(each_row)

    return_dict = {"MyTable": dt}

    return render(request, template, return_dict)

项目根/myownpackage/DataTable.py

class DataTable:

    DataColumns = []
    DataRows = []

    def add(self, data_row):
        if len(self.DataColumns) != len(data_row):
            raise IndexError("Target column count does not match DataTable's DataColumn count.")
        else:
            self.DataRows.append(data_row)

    def remove(self, index):
        self.DataRows.remove(index)

第一次加载此页面时, foo/bar.html 似乎正是我想要的。我可以看到打印到页面上的列,以及该表中的几行。如果刷新页面,问题就会出现。就好像dt在函数返回了 render() 之后被缓存了一样。

刷新页面时,您会看到列和第一个请求中的行重复!如果我们第三次刷新,我们将看到第三组相同的行!DataTable 的这种附加会在您刷新时持续进行多次。显然,dt在函数内实例化后被存储在此函数之外,我不确定为什么或如何发生这种情况。

注意:只有行被一遍又一遍地添加。列保持不变。这是因为在表格上设置了列,而正在添加行。

我尝试过的事情:

dt分配给该 return_dict 后,我​​尝试了dt = Nonedel dt。这些都不起作用,刷新页面时显示相同的结果。

我对 Stack Overflow 的问题:

为什么函数返回后,名为dt的 DataTable 实例没有被丢弃?

如果这(无论出于何种原因)是正常的,当我完成它时,我能做些什么来销毁该 DataTable 实例?

标签: pythondjangopython-3.xdjango-templatesdjango-views

解决方案


事实证明,问题在于 DataRows 在 DataTable 类中是静态的。该类应如下所示:

class DataTable:

    def __init__(self):
        self.DataColumns = []
        self.DataRows = []

推荐阅读