许多HTTP 304响应导致更少的GET请求

时间:2018-11-12 20:19:59

标签: django google-chrome django-staticfiles http-caching

我有一台Django开发服务器,该服务器托管一个网页,该网页实时(ish)显示从我监视的众多服务器中收集的信息。该网页仍在开发中,因此我目前正在使用Django随附的内置Web主机,该主机是在Ubuntu主机上以

开头的

python3 manage.py runserver IP:Port

在同一台ubuntu主机上,有一个python脚本不断地到达受监视的服务器,并将响应格式化为.html文件,客户端每分钟在<div>内重新加载该文件。客户端访问页面的常规功能如下:

<div id="status" style="width:100%; height: 1000"></div>
<script>
    $('#status').load("{% static 'alerts/status.html' %}");
    setInterval(function() {
        $('#status').load("{% static 'alerts/status.html' %}");
    }, 60000);
</script>

...因此页面将在页面加载时在分区中加载status.html文件,然后每分钟重新加载一次。这一直很好,但是,我注意到在Django日志中发现,如果十个状态304(未修改)响应后status.html仍未更改,则请求之间的等待时间开始下降。就是说,不是等待1分钟,而是等待2分钟,然后等待5分钟,依此类推(大概,我忘记了实际的滚降速度)。

现在我面临的问题是我的服务器在周末关闭(不相关),但是我的网页处于打开状态的显示屏仍然处于活动状态,因此它滚动得太多了,似乎已经完全关闭了损坏,拒绝下载最新的status.html,即使我强迫Chrome重新加载所有内容而不使用缓存(ctrl + Rshift + F5)。

我尝试研究这种滚降,但找不到任何信息。我认为这是Google Chrome(我正在使用的浏览器)内置的功能,可以在页面未更改但状态页最多为几千字节的情况下节省带宽,而304个响应已经节省了一点带宽,因此有一种方法可以完全禁用这种滚降功能,这是理想的选择。

在任何情况下,由于我似乎找不到任何文档,因此非常感谢我为什么会看到此行为/它来自何处。我发现最接近的内容来自Google的here缓存开发人员文档。它提到了定义最大年龄和无缓存行为的功能,因此我可以强制客户端每隔一分钟重新下载status.html,但这似乎很混乱。尽管在status.html最多为几千字节的情况下,这在我的特定情况下是可行的,但仅禁用这种下滚行为将达到窍门,而 则会使不必要的带宽下降。

2 个答案:

答案 0 :(得分:1)

这里的问题是status.html的响应没有显式的缓存到期标头。在没有此类标头的情况下,浏览器可以自由使用自己的算法(例如您看到的滚降)来选择到期时间。来自RFC 7234

  

由于原始服务器并不总是提供明确的到期时间,因此当未指定明确的时间时,缓存可以分配启发式到期时间。...此规范未提供特定的算法。

因此解决方案很简单:分配一个明确的缓存过期时间。

不幸的是,使用Django的staticfiles应用程序实施此解决方案并非易事。此应用程序的更好默认设置是根本不缓存结果,但该解决方案was deferred待与whitenoise合并之前。

解决方案包括使用其他服务器(例如nginx);使用其他应用程式(例如Whitenoise);或直接使用静态视图而不是使用staticfiles应用程序(有关几种方法,请参见this question)。

答案 1 :(得分:0)

尝试一下:

// Page reload every 60 seconds
setInterval(function(){
    location.reload();
}, 60000);