2016-08-01 2 views
4

Итак, я создаю прогрессивное веб-приложение Django с автономной поддержкой с использованием рабочих сервисов.Django и сервисные работники - обслуживают «sw.js» у корневого URL-адреса приложения

Согласно google's documentation, файл sw.js должен быть в корне URL-приложения:

Вы должны сделать это, потому что сфера применения работника службы (набор URLs, что ServiceWorker будет загружаться для) определяется в каталоге , где он находится.

В настоящий момент я обслуживаю все статические активы из папки http://example.com/static/. Но мне нужно обслуживать этот конкретный файл по адресу: http://example.com/sw.js.

Любая идея, как я могу это достичь? Я мог бы сделать определенное правило nginx для этого перенаправления, но я не знаю, является ли это самым чистым способом сделать это. Возможно, этот параметр должен находиться в urls.py?

Примечание: Я видел this question, который предлагает использовать метод static() из django.conf.urls.static. Но django's docs говорят, что статический метод предназначен только для разработки, поэтому мне нехорошо.

Примечание (2): Я предполагаю, что смогу изменить настройку STATIC_URL, но я доволен, что мои файлы обслуживаются из/статического каталога. Я хочу, чтобы этот файл был только в корневом каталоге url.

ответ

10

Вы можете обслуживать javascript как представление, а не только html. Поместите это в ваших проектах urls.py

url(r'^service-worker.js', cache_control(max_age=2592000)(TemplateView.as_view(
    template_name="service-worker.js", 
    content_type='application/javascript', 
)), name='service-worker.js'), 

Затем положить service-worker.js в каталоге шаблонов.

Бонус в том, что вы также можете использовать теги шаблонов, такие как статические в вашем файле javascript.

+1

Вы можете удалить cache_control, так как работники службы по умолчанию не может быть кэшируются в течение более 24 часов, и, как правило, вы хотите, чтобы служить новым как только он будет доступен. – Tiagojdferreira

+0

, но я хочу, чтобы лак на интерфейсе кэшировал эту страницу. Тем более, что он будет запрашиваться каждым клиентом каждые 24 часа. Затем вы просто кешируете грудь url, т. Е. 'Var sw = navigator.serviceWorker.register ('{% url' service-worker.js '%}? V = 13');' – dalore

1

В Django 1.11 urls.py должен выглядеть:

from django.views.generic import TemplateView 

urlpatterns = [ 
    url(r'^sw.js', (TemplateView.as_view(template_name="sw.js", content_type='application/javascript',)), name='sw.js'), 
] 
+1

Почему вы импортируете 'cache_control'? верхний ответ выше работает для всех URL-адресов django – dalore

Смежные вопросы