Django 2.1视图中类实例意外缓存问题求助
解决Django 2.1中类实例被缓存导致页面显示旧数据的问题
嘿,我之前踩过完全一样的坑!大概率是你把MyTable的实例创建在了视图函数的外部——也就是模块级别的作用域里,而不是每次处理请求时在视图内部生成新实例。
为什么会出现缓存?
Django运行时,views.py模块会被加载一次后就驻留在服务器内存中。如果你的类实例是在模块顶层(所有函数外面)定义的,那这个实例会被所有请求共享,相当于全局缓存了,自然每次刷新页面都会拿到旧数据。
快速修复方案
方案1:每次请求创建新实例(最推荐)
把实例的初始化逻辑挪到视图函数内部,确保每个请求都拿到全新的实例:
# projectroot/myapp/views.py from django.shortcuts import render class MyTable: def __init__(self): # 在这里写获取最新数据的逻辑,比如查数据库/调用API self.DataColumns = self._fetch_latest_columns() self.DataRows = self._fetch_latest_rows() def _fetch_latest_columns(self): # 示例:返回最新的列数据 return ["用户ID", "用户名", "注册时间"] def _fetch_latest_rows(self): # 示例:返回最新的行数据 return [["1", "张三", "2024-01-01"], ["2", "李四", "2024-01-02"]] def your_view_function(request): # 关键:每次请求都新建MyTable实例 my_table = MyTable() return render(request, 'myapp/bar.html', {'MyTable': my_table})
方案2:全局实例强制刷新数据(特殊场景用)
如果因为某些原因必须用全局实例,那就在每次请求时主动刷新数据:
# projectroot/myapp/views.py from django.shortcuts import render class MyTable: def __init__(self): # 初始化时先加载一次数据 self.refresh_data() def refresh_data(self): # 重新获取最新数据的逻辑 self.DataColumns = self._fetch_latest_columns() self.DataRows = self._fetch_latest_rows() # 省略_fetch_latest_columns和_fetch_latest_rows方法... # 全局实例 global_my_table = MyTable() def your_view_function(request): # 每次请求都强制刷新数据 global_my_table.refresh_data() return render(request, 'myapp/bar.html', {'MyTable': global_my_table})
避坑提醒
检查你的views.py,是不是犯了下面这种错误:
# 错误写法!实例在模块级别,会被缓存 my_table = MyTable() def your_view_function(request): return render(request, 'myapp/bar.html', {'MyTable': my_table})
这种写法下,my_table只会在模块加载时创建一次,后续所有请求都会复用这个旧实例,自然看不到新数据。
内容的提问来源于stack exchange,提问作者Joshua Schlichting
相关产品推荐
相关产品推荐

