1

我一直在用 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 }}" />

当文件名以.svgPyramid 结尾时,提供文件,但是当我将其替换为.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。

4

1 回答 1

0

1) 启动连接到终端的 WSGI 服务器

2)在此处添加打印https://github.com/Pylons/pyramid/blob/master/pyramid/response.py#L57(因为它肯定使用mimetypes,如前所述)

3) 运行下载视图以查看打印的内容。您应该查看 mimetypes 本身是否有问题,或者该视图中的其他问题是否失败。

于 2015-12-22T07:18:20.280 回答