【问题标题】:Django: How can I gzip staticfiles served in dev mode?Django:我如何 gzip 在开发模式下提供的静态文件?
【发布时间】:2011-11-26 10:44:58
【问题描述】:

我的 django.contrib.staticfiles 设置似乎没问题,因为所有静态文件都按预期提供。 但是,例如。 /static/*.css 文件没有被 gzip 压缩,尽管我打开了 GZipMiddleware。

仅供参考。我的视图 html 实际上确实被压缩了,只有 staticfiles 应用程序提供的文件没有。这些响应似乎没有通过中间件链?

【问题讨论】:

    标签: django gzip django-staticfiles


    【解决方案1】:

    诀窍是让开发服务器在设置“--nostatic”标志的情况下运行:./manage.py runserver --nostatic

    然后可以使用 url 模式来提供静态文件,如下所示:

    if settings.DEBUG:
        static_pattern = r'^%s(?P<path>.*)$' % (settings.STATIC_URL[1:],)
        urlpatterns += patterns('django.contrib.staticfiles.views',
            url(static_pattern, 'serve', {'show_indexes': True}),
        )
    

    当不使用 --nostatic 运行时,django 将自动在 STATIC_URL 下提供服务,而无需通过中间件链。

    感谢戴夫的指点!

    【讨论】:

    • 不错的答案。 django上游如何拒绝此功能。
    【解决方案2】:

    您的settings.MIDDLEWARE_CLASSES 顶部是否可能没有GZipMiddleware?这可能会导致奇怪的行为。

    但是,如果这是一个生产服务器,您可能根本不应该使用 django 提供静态文件。我推荐 gunicorn 和 nginx。

    编辑:如果不是这样,如果您通过 urls.py“手动”提供文件,使用类似:

    urlpatterns += staticfiles_urlpatterns() + \
            patterns('',
                (r'^%s/(?P<path>.*)$' % settings.MEDIA_URL.strip('/'), 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
                *[(r'^%s/(?P<path>.*)$' % settings.STATIC_URL.strip('/'), 'django.views.static.serve', {'document_root': path, 'show_indexes': True}) for path in settings.STATICFILES_DIRS]
            )
    

    替代方案#3:Nginx 很容易在本地安装,您只需将其指向您的 Django 服务器(不需要 gunicorn/uwsgi/whatever)。

    【讨论】:

    • 是的,GZipMiddleWare 位于顶部。不,就像我在主题中写的那样,我的问题是关于开发模式的。在生产中,我也使用 nginx 并在那里完成压缩等。现在我也有兴趣在开发时查看我的静态资产的近似文件大小。
    • @Carsten,您也可能希望在问题内容中提及“开发模式”......因为在阅读此评论后我花了 30 秒才找到它:) 我想我们中的一些人不知道'点击标题后不阅读!
    • @Carsten,我又添加了两个你可以尝试的东西。
    【解决方案3】:

    在生产环境中,您的网络服务器 (Apache/Nginx/IIS) 负责 gzip 静态压缩,因此 gzip 是否在 dev 中工作并不重要。

    【讨论】:

    • 嗯,这对我来说很重要,所以我写了这个问题(主题中带有“开发模式”)。 )
    【解决方案4】:

    Carsten 的回答补充 https://stackoverflow.com/a/7673706/8137384

    现代版本包含助手:

    from django.conf.urls.static import static
    
    if settings.DEBUG:
        urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 2012-03-25
      • 2012-06-04
      • 2016-09-27
      • 2012-01-26
      • 2013-12-22
      • 2015-08-06
      • 1970-01-01
      • 2012-03-01
      相关资源
      最近更新 更多