我有一个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的模板,我是否可以仅缓存该页面并仅在离线时显示该页面,而不是尝试缓存主应用程序页面?
这不是django问题,而是浏览器问题。您的浏览器正在缓存页面以缩短加载时间。浏览器选择要缓存的页面取决于浏览器,但在您看来,它似乎是主页。浏览器还做出明智的决定来缓存页面的CSS,JS,页眉,因为它可能不会改变。注意:-如果您使用的是服务器端缓存(例如memcache或varnish),则每次更新后都必须使缓存无效。