Django和服务工作者 - 在应用程序的根URL上提供"sw.js"

Mon*_*nja 9 django django-urls django-staticfiles service-worker

所以我正在构建一个Django渐进式Web应用程序,使用服务工作者提供离线支持.

根据谷歌的文档,sw.js文件应该是应用程序URL的根目录:

您需要执行此操作,因为服务工作者的范围(ServiceWorker将加载的URL集)由其所在的目录定义.

目前,我正在从http://example.com/static/文件夹中提供所有静态资源.但我需要在以下网址上提供此特定文件:http://example.com/sw.js.

知道我怎么能做到这一点?我可以制定一个特定的nginx规则来执行此重定向,但我不知道这是否是最干净的方法.也许这个设置应该存在于urls.py中?

注意:我已经看到这个问题建议使用static()方法django.conf.urls.static.但是django的文档说静态方法仅供开发使用,对我不利.

注意(2):我想我可以更改STATIC_URL设置,但我对从/ static目录提供的文件感到满意.我只希望这个文件位于url的根目录下.

dal*_*ore 15

您可以将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'),
Run Code Online (Sandbox Code Playgroud)

然后将您service-worker.js放入模板目录中.

现在,您可以在javascript文件中使用静态模板标签.


Tay*_*ach 5

姜戈2.2

项目结构

myproj/
|-app/
| |-templates/
|   |-app/
|     -sw.js
|-myproj/
  -urls.py
Run Code Online (Sandbox Code Playgroud)

urls.py(项目)

from django.views.generic import TemplateView

urlpatterns = [
  ...
  path('sw.js', (TemplateView.as_view(template_name="app/sw.js", 
  content_type='application/javascript', )), name='sw.js'),
]
Run Code Online (Sandbox Code Playgroud)