【发布时间】:2015-12-15 17:32:46
【问题描述】:
我一直在用 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 不会t 响应 URL 并且 nginx 报告 404(因为就 nginx 而言,文件不在/app/static/img/file.svgz)。
我有一种感觉,这是因为 Pyramid 不知道如何为 SVGZ 设置 Content-Type / Content-Encoding,所以它把它交还给 nginx,类似于这个关于 web 字体的问题: Web fonts always return 404 from static path。不幸的是,该帖子中没有答案,所以我希望有人知道如何配置 Pyramid 以静态地提供 SVGZ(和其他不太常见的类型)。
其他类似问题 (How to set the content type header in response for a particular 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。
【问题讨论】:
-
mimetypes绝对应该删掉它。您正在使用相同的 Python 解释器/安装运行您的应用程序并从命令行尝试mimetypes?例如。你没有安装旧的 mimetypes 吗? -
@MikkoOhtamaa,是的,我使用运行 Pyramid 应用程序的同一 virtualenv 测试了
mimetypes。 -
下一步是将调试日志记录/调试打印植入 Pyramid 本身。 1) 启动连接到终端的 WSGI 服务器 2) 在此处添加 print github.com/Pylons/pyramid/blob/master/pyramid/response.py#L57 [因为它肯定使用 mimetypes] 3) 运行下载以查看它打印的内容。您应该查看 mimetypes 本身是否有问题,或者该视图中的其他问题是否失败。