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

Django本地内存缓存LocMemCache每次请求都触发重新获取数据问题

Django LocMemCache 缓存不生效原因及排查方案

常见原因

  • 未主动调用缓存逻辑:仅配置CACHES缓存后端不会自动生效,需要主动给视图加缓存装饰器、或使用cache.set/cache.get手动操作缓存
  • 缓存超时时间过短:视图缓存装饰器cache_page传入的超时时间为0或极小值,缓存写入后立刻过期
  • 进程自动重启清空缓存:runserver默认开启代码改动自动重载功能,每次修改代码后进程重启,存在进程内存中的LocMemCache会被全部清空
  • 缓存键生成规则不匹配:不同请求(不同用户、不同查询参数、不同请求方法)生成的缓存键不一致,无法命中已有缓存
  • 响应头强制不缓存:视图返回的响应携带Cache-Control: no-cache等禁用缓存的头,或请求端主动要求不缓存
  • 调试组件冲突:django-debug-toolbar等调试工具默认会禁用缓存逻辑,导致缓存不生效
  • 类视图缓存装饰器使用错误:类视图不能直接添加cache_page装饰器,需要通过method_decorator绑定到dispatch方法上

排查步骤

  1. 先验证缓存本身是否正常工作,在项目中执行如下测试代码:
from django.core.cache import cache

# 写入测试缓存,有效期60秒
cache.set('test_cache_key', 'hello world', 60)
# 读取缓存
print(cache.get('test_cache_key'))

如果输出为None,说明缓存后端配置未正确加载,检查settings.py中是否有其他覆盖CACHES配置的逻辑,确认配置加载顺序正确。
2. 验证视图缓存配置是否正确:
- 函数视图检查是否正确添加cache_page装饰器,示例:
```python
from django.views.decorators.cache import cache_page

# 配置缓存15分钟
@cache_page(60 * 15)
def test_view(request):
    # 加打印验证视图是否被调用
    print("test_view 执行")
    return HttpResponse("test")
```
- 类视图检查装饰器是否正确绑定到dispatch方法,示例:
```python
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import TemplateView

@method_decorator(cache_page(60 * 15), name='dispatch')
class TestClassView(TemplateView):
    template_name = "test.html"
```
  1. 排除自动重载影响:修改完所有代码后手动重启runserver,第一次访问视图看控制台是否有打印,第二次访问如果没有打印说明缓存生效,仍有打印继续排查。
  2. 关闭调试组件测试:临时注释掉settings.py中django-debug-toolbar相关的配置和中间件,重启服务后验证缓存是否生效。
  3. 检查响应头:打开浏览器开发者工具查看响应头的Cache-Control字段,确认没有no-cache、no-store等禁用缓存的配置。

内容的提问来源于stack exchange,提问作者Anupam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:24:05