You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:25:14