我一直在用 SVGZ 文件替换我网站上的 SVG 图像,但我无法让 Pyramid 从 static_url 提供它们。
__init.py__
有:
config.add_static_view(name='static', path='app:static', cache_max_age=3600)
模板有:
<img src="{{ 'app:static/img/file.svgz'|static_url }}" />
当文件名以.svg
Pyramid 结尾时,提供文件,但是当我将其替换为.svgz
(是的,SVGZ 文件与 SVG 文件位于同一目录中,具有相同的权限)时,Pyramid 不响应 URL 并且 nginx 报告404(因为/app/static/img/file.svgz
就 nginx 而言文件不在)。
我有一种感觉,这是因为 Pyramid 不知道如何为 SVGZ 设置 Content-Type / Content-Encoding 所以它把它交还给 nginx,类似于这个关于 web fonts 的问题: Web fonts always return 404 from static path。不幸的是,该帖子中没有答案,所以我希望那里有人知道如何配置 Pyramid 以静态地提供 SVGZ(和其他不太常见的类型)。
其他类似的问题(How to set the content type header in response for a specific file type in Pyramid web framework)提到 Pyramid 使用mimetypes
库来计算文件类型信息,但该库似乎 grok svgz,所以我不知道为什么它无法弄清楚如何提供这些文件:
Python 3.4.2 (default, Oct 8 2014, 10:45:20)
[GCC 4.9.1] on linux
>>> import mimetypes
>>> mimetypes.guess_type('file.svgz')
('image/svg+xml', 'gzip')
FWIW,我的 Nginx 配置有以下内容,但我怀疑这与 Pyramid 的用途有很大关系。
location ~ \.svgz$ {
add_header Content-Encoding gzip;
}
编辑:我认为这是导致问题的 Nginx 配置错误,与 Pyramid 无关。我正在使用与 Pyramid 食谱 ( http://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/deployment/nginx.html ) 中相同的代理设置,包括步骤 3 中显示的静态配置,其中指出:“根目录不指向静态目录有点奇怪,但它可以工作,因为 Nginx 会将实际 URL 附加到指定路径。”
在我看来,location ~ \.svgz$
上面列出的指令与 Pyramid 应用程序的静态配置之间存在一些冲突。当我删除它时,Nginx 会从我的 Pyramid 静态路径中提供 SVGZ 文件,但它无法设置正确的内容编码,因此它不会加载到浏览器中。当我重新添加指令时,Nginx 报告 404。就好像 .svgz 上的匹配以某种方式短路了附加正确的 URL。