Django仅在进行强制刷新(shift +刷新)后才加载正确的页面,因为服务工作者不会在每次刷新时使缓存失效

问题描述 投票:0回答:1

我有一个Django应用,该应用使用条件逻辑来确定要在导航栏中显示的内容。例如,如果用户未通过身份验证->显示“登录”,否则->“显示用户名”。它在开发中工作完美,但是在我的apache服务器上,除非我在野生动物园和Chrome中执行shift + refresh,否则它似乎总是执行“ else”块。似乎只能在我的索引页面上执行此操作,在应用程序的其他页面上,if / else可以按预期工作。

base.html

        {% if user.is_authenticated %}
            <a href="{% url 'login-signout' %}" id="account-link">
                {% if user.username %}
                    {{user.username | capfirst }}
                {% elif user.first_name %}
                    {{user.first_name | capfirst }}
                {% else %}
                    Account
                {% endif %}
            </a>
        {% else %}
            <a href="{% url 'login-signup' %}" id="account-link">
                Login
            </a>
        {% endif %}

我试图获得项目的全新副本,但是得到的结果相同。知道为什么会这样吗?

编辑以更新问题因此,在注释中提出了建议的修复之后,我能够确定问题是服务工作者正在查看旧的缓存,而不是每次刷新都获得新的副本。

serviceworker.js

var staticCacheName = "django-pwa-v" + new Date().getTime();

// caches on install
self.oninstall = function (evt) {
    evt.waitUntil(caches.open(staticCacheName).then(function (cache) {
        return Promise.all(['/', 'main/home.html'].map(function (url) {
            return fetch(new Request(url, { redirect: 'manual' })).then(function (res) {
                return cache.put(url, res);
            });
        }));
    }));
};

// Clear cache on activate
self.addEventListener('activate', event => {
    event.waitUntil(
        caches.keys().then(cacheNames => {
            return Promise.all(
                cacheNames
                    .filter(cacheName => (cacheName.startsWith("django-pwa-")))
                    .filter(cacheName => (cacheName !== staticCacheName))
                    .map(cacheName => caches.delete(cacheName))
            );
        })
    );
});

// serve from cache
self.onfetch = function (evt) {
    var url = new URL(evt.request.url);
    if (url.pathname != '/' && url.pathname != 'main/home.html') return;
    evt.respondWith(caches.match(evt.request, { cacheName: staticCacheName }));
};

为了完全避免这个问题,我在templates / main / offline.html中构建了一个名为offline的模板,我是否可以仅缓存该页面并仅在离线时显示该页面,而不是尝试缓存主应用程序页面?

python django service-worker progressive-web-apps browser-cache
1个回答
1
投票

这不是django问题,而是浏览器问题。您的浏览器正在缓存页面以缩短加载时间。浏览器选择要缓存的页面取决于浏览器,但在您看来,它似乎是主页。浏览器还做出明智的决定来缓存页面的CSS,JS,页眉,因为它可能不会改变。注意:-如果您使用的是服务器端缓存(例如memcache或varnish),则每次更新后都必须使缓存无效。

© www.soinside.com 2019 - 2024. All rights reserved.