Django自定义Template Tags返回内容被缓存 如何实现刷新时返回动态HTML
Django模板标签返回静态内容(仅重启服务更新)的解决方案
- 修正动态逻辑的作用域
绝大多数这类问题都是因为把动态计算逻辑写到了模板标签函数的外层(模块级/全局作用域),Django启动时只会加载一次标签模块,外层变量只会计算一次,后续调用标签都会复用旧值。
错误示例:from django import template import datetime register = template.Library() # 模块级变量,仅加载标签时计算1次 current_time = datetime.datetime.now() @register.simple_tag def get_time(): return current_time正确写法:把所有动态逻辑(数据库查询、时间计算、请求参数获取等)全部放到标签函数内部,每次调用标签都会重新执行:
@register.simple_tag def get_time(): # 每次调用标签都会重新计算当前时间 return datetime.datetime.now()
- 移除标签多余的缓存配置
如果你给模板标签加了
@cache、@cache_page这类缓存装饰器,且没有设置合理的过期时间,或者缓存键没有区分动态场景,就会一直返回缓存内容。不需要缓存直接删除装饰器即可,需要缓存的话要缩短缓存时效,给缓存键加入用户ID、请求参数等动态变量做区分。
- 开发环境禁用模板缓存
DEBUG模式下如果还是出现该问题,可以在
settings.py中调整模板配置,关闭模板加载缓存:TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'debug': True, # 调试模式下不使用缓存加载器 'loaders': [ 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', ] if DEBUG else [ ('django.template.loaders.cached.Loader', [ 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', ]), ], }, }, ]
- 排查浏览器端缓存
确认视图返回的响应头没有设置过长的强缓存,可以给对应视图加
@never_cache装饰器强制浏览器每次都请求最新内容:from django.views.decorators.cache import never_cache @never_cache def your_view(request): # 视图逻辑 return render(request, 'your_template.html')
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

