Flask部署Apache后JS读取XML数据存在缓存问题求助
这个问题我之前也碰到过,核心原因基本都是缓存机制在搞鬼——不管是Apache服务器端的静态资源缓存,还是浏览器端的本地缓存,都会导致修改XML后页面没法及时获取最新数据。下面分情况给你讲清楚:
1. Apache服务器端缓存
Apache默认会对静态文件(比如XML、JS、CSS这类)做缓存优化,尤其是当你没有明确设置缓存控制规则的时候,它可能会把XML文件的内容存在内存里,不会每次请求都去磁盘读取最新版本。重启Apache后缓存被清空,自然就能读到新数据了。
解决办法:修改Apache缓存配置
你可以通过Apache的配置文件(比如httpd.conf)或者项目根目录的.htaccess文件,给XML文件添加强制不缓存的规则:
<FilesMatch "\.(xml)$"> # 告诉服务器和浏览器不要缓存 Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" # 设置过期时间为0,立即过期 Header set Expires 0 </FilesMatch>
保存配置后重启Apache,这样每次请求XML文件时,Apache都会去磁盘读取最新内容。
2. 浏览器端本地缓存
就算服务器已经返回了最新的XML,浏览器可能还会拿着之前缓存的旧数据不撒手——因为它觉得相同URL的资源没必要重复请求。
解决办法:给请求URL加随机参数
在JS请求XML的时候,给URL末尾加上一个随机的时间戳参数,这样每次请求的URL都是“新”的,浏览器就会重新向服务器请求数据:
function ReadTemperatureFromXML() { var xmlhttp; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { // 兼容旧浏览器 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } // 添加时间戳参数,避免浏览器缓存 var xmlUrl = "你的XML文件路径?t=" + new Date().getTime(); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { var xmlDoc = xmlhttp.responseXML; // 这里处理你的XML数据逻辑 } }; xmlhttp.open("GET", xmlUrl, true); xmlhttp.send(); }
3. 额外检查:WSGI进程缓存(如果Flask用mod_wsgi部署)
如果你是用mod_wsgi把Flask部署到Apache,还有一种可能是WSGI进程在启动时加载了XML内容并缓存起来了。不过这种情况一般是Flask代码里直接读取XML文件(不是JS前端请求)才会出现,如果你是纯前端JS读取静态XML文件,这个可能性不大。但要是你有后端接口返回XML数据,可以在Flask接口里每次读取文件时都强制刷新,或者禁用WSGI的进程缓存。
最后提醒一下:修改完配置后,记得清空浏览器的缓存(按Ctrl+Shift+R强制刷新页面)测试一下,避免浏览器还拿着旧缓存干扰你的测试结果。
内容的提问来源于stack exchange,提问作者Marek Navrátil

