【问题标题】:SVGZ files not served from Pyramid static viewPyramid 静态视图未提供 SVGZ 文件
【发布时间】: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 本身是否有问题,或者该视图中的其他问题是否失败。

标签: svg pyramid svgz


【解决方案1】:

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

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

3) 运行下载视图以查看打印的内容。您应该看看是 mimetypes 本身的问题还是该视图中的其他问题。

【讨论】:

  • 这一定与我的生产设置有关。运行pserve production.ini 会产生一个服务器(女服务员),它将从静态图像目录中为SVGZ 提供服务,并且插入response.py 的打印语句显示image/svg_xml 和gzip 编码。但是当在 127.0.0.1 上运行并通过 nginx 代理提供服务时,SVGZ 不起作用。我认为我的 nginx 设置是罪魁祸首,而不是 Pyramid。
  • 如果相关,请将您的 Nginx 和相关配置添加到问题中。
  • 如果您认为它有帮助,我可以,但应用程序的配置与 Pyramid Cookbook 中的完全相同,并且添加的唯一相关内容是 location ~ \.svgz$ {} 配置,所以 nginx 知道发送正确的标题。
猜你喜欢
  • 2020-12-11
  • 2018-08-07
  • 1970-01-01
  • 2020-11-21
  • 2018-07-21
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多