Django загружает правильную страницу только после жесткого обновления sh (shift + refre sh), потому что работник службы не отменяет кэш при каждом обновлении - PullRequest
0 голосов
/ 19 января 2020

У меня есть приложение Django, которое использует условную логику c, чтобы определить, что отображать на панели навигации. Например, если пользователь не аутентифицирован -> показать «Логин», иначе -> «показать имя пользователя». Он отлично работает в разработке, но на моем apache сервере, кажется, всегда выполняется блок «else», если я не выполню shift + refre sh в safari и chrome. Кажется, он делает это только на моей странице индекса, на других страницах приложения 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 %}

Я пытался просто получить бесплатную sh копию проекта, но я получаю те же результаты. Есть идеи, почему это может происходить?

Изменить, чтобы обновить вопрос Так что после предложенного исправления в комментариях я смог определить, что проблема в том, что работник службы смотрит на старый кеш, а не получает новую копию каждый refre sh.

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 }));
};

Чтобы вообще избежать этой проблемы, я создал шаблон под названием offline в шаблонах / main / offline. html, могу ли я просто кэшировать эту страницу и показывать только в автономном режиме, а не пытаться кэшировать главную страницу приложения?

1 Ответ

1 голос
/ 19 января 2020

Это не проблема django, а проблема браузера. Ваш браузер кэширует страницы, чтобы улучшить время загрузки. Какие страницы браузер выбирает для кеширования, зависит от браузера, но в вашем случае это домашняя страница. Кроме того, браузер принимает умные решения для кэширования css, js, заголовка страницы, потому что он, вероятно, не изменится. Примечание: - Если вы используете кеширование на стороне сервера, например memcache или varni sh, вы должны аннулировать кеш после каждого обновления.

Update
После выяснения его недействительности кеша Вопрос, могу ли я предложить, пожалуйста, прочитайте документацию на официальном аффилированном сайте W3, там были все ответы о том, как сделать кеш недействительным и как обслуживать автономные страницы.
https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Offline_Service_workers

...