python - 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 = None和del dt。这些都不起作用,刷新页面时显示相同的结果。
我对 Stack Overflow 的问题:
为什么函数返回后,名为dt的 DataTable 实例没有被丢弃?
如果这(无论出于何种原因)是正常的,当我完成它时,我能做些什么来销毁该 DataTable 实例?
解决方案
事实证明,问题在于 DataRows 在 DataTable 类中是静态的。该类应如下所示:
class DataTable:
def __init__(self):
self.DataColumns = []
self.DataRows = []
推荐阅读
- php - Codecept 没有显示任何 php 单元测试结果
- c# - Unity - 添加 Buffs 并将其分配给 UI,重复 for 循环进行分配
- javascript - 如何在反应中从父组件内部初始化子组件状态?
- typescript - 打字稿:从对象的联合中提取类型
- sql-server - OData 源验证失败并返回错误代码 0xC020801F
- json - 在列表中添加但未显示的 React 下拉值
- java - Spring WebClient 不读取超媒体链接
- flutter - 在最新的 bloc 包中使用 stream.listen 是什么意思
- reactjs - 在 useState 中对对象使用地图
- c# - asp.net core 中的一个路径遍历漏洞