Django仅在硬刷新(shift+refresh)后加载正确的页面,因为服务工作者不会在每次刷新时使缓存无效

2024-06-30 16:20:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序,它使用条件逻辑来确定在导航栏中显示什么。例如,如果用户未经过身份验证-->;显示“登录”,否则-->;“show username.”它在开发中工作得很好,但在我的apache服务器上,它似乎总是执行“else”块,除非我在safari和chrome中执行shift+刷新。它似乎只在我的索引页面上执行此操作,在应用程序中的其他页面上,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的模板,我是否可以缓存该页面并仅在脱机时显示它,而不是尝试缓存主应用程序页面


Tags: 应用程序urlcachereturnifhtmlusernamefunction
1条回答
网友
1楼 · 发布于 2024-06-30 16:20:22

这不是django的问题,而是浏览器的问题。您的浏览器正在缓存页面以缩短加载时间。浏览器选择缓存哪些页面取决于浏览器,但在您的情况下,它似乎是主页。此外,浏览器会做出明智的决定,缓存css、js和页面标题,因为它可能不会改变。 注意:-如果您使用服务器端缓存,如memcache或varnish,则必须在每次更新后使缓存无效

更新
在弄清楚它的缓存失效问题后,我建议您,请阅读W3官方附属网站上的文档,它有关于如何使缓存失效以及如何为脱机页面提供服务的所有答案。
https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Offline_Service_workers

相关问题 更多 >