我的 django.contrib.staticfiles 设置似乎没问题,因为所有静态文件都按预期提供。但是,例如。/static/*.css 文件没有被 gzip 压缩,尽管我打开了 GZipMiddleware。
供参考。我的视图 html 实际上确实被压缩了,只有 staticfiles 应用程序提供的文件没有。似乎这些响应没有通过中间件链?
我的 django.contrib.staticfiles 设置似乎没问题,因为所有静态文件都按预期提供。但是,例如。/static/*.css 文件没有被 gzip 压缩,尽管我打开了 GZipMiddleware。
供参考。我的视图 html 实际上确实被压缩了,只有 staticfiles 应用程序提供的文件没有。似乎这些响应没有通过中间件链?
诀窍是让开发服务器在设置“--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 下提供服务,而无需通过中间件链。
感谢戴夫的指点!
是否有可能您的顶部没有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)。
在生产环境中,您的网络服务器(Apache/Nginx/IIS)负责 gzip 静态压缩,因此 gzip 是否在 dev 中工作并不重要。
卡斯滕回答的附加内容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)