7

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

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

4

4 回答 4

7

诀窍是让开发服务器在设置“--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 下提供服务,而无需通过中间件链。

感谢戴夫的指点!

于 2011-10-06T11:38:41.360 回答
2

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

但是,如果这是一个生产服务器,您可能根本不应该使用 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)。

于 2011-09-27T23:06:14.223 回答
0

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

于 2011-09-28T02:22:44.807 回答
0

卡斯滕回答的附加内容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)
于 2021-04-27T10:03:39.830 回答