我有一个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的模板,我是否可以缓存该页面并仅在脱机时显示它,而不是尝试缓存主应用程序页面
这不是django的问题,而是浏览器的问题。您的浏览器正在缓存页面以缩短加载时间。浏览器选择缓存哪些页面取决于浏览器,但在您的情况下,它似乎是主页。此外,浏览器会做出明智的决定,缓存css、js和页面标题,因为它可能不会改变。 注意:-如果您使用服务器端缓存,如memcache或varnish,则必须在每次更新后使缓存无效
更新
在弄清楚它的缓存失效问题后,我建议您,请阅读W3官方附属网站上的文档,它有关于如何使缓存失效以及如何为脱机页面提供服务的所有答案。
https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Offline_Service_workers
相关问题 更多 >
编程相关推荐