【问题标题】:rdkit svg flavors and rendering inline svg on django dev serverrdkit svg 风格和在 django 开发服务器上渲染内联 svg
【发布时间】:2013-11-29 19:58:06
【问题描述】:

您好,我正在尝试在由 Django 模板呈现的文档中提供 svg 内联,其中 svg(2D 线条图)和文档上下文是动态生成的。 svg_string 被放入我的 django 上下文并由模板渲染。

{{ svg_string|safe }}

我使用的 django 版本是 1.4.2 ,Python 版本是 2.7.3 .rdkit 我的所有代码在永久 IP 上都运行良好。 svg 呈现完美。

现在,当我尝试使用 django (1.4.2) 开发服务器 http://127.0.0.1:8000 测试包含视图的 SVG 时

我只得到在 Chrome、Firefox 和 Safari 中呈现的 svg 中的文本标签。

然而,这两个 svg 之间有一个区别。它们由不同版本的 rdkit Cheminformatics 库生成,该库在后端使用 cairo。

生产服务器提供的 svg 在 html 页面的视图源中具有 svg:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300pt" height="300pt" viewBox="0 0 300 300" version="1.1">
<defs>
<g>
<symbol overflow="visible" id="glyph0-0">
<path style="stroke:none;" d="M 0.40625 1.421875 L 0.40625 -5.640625 L 4.40625 -5.640625 L 4.40625 1.421875 Z M 0.84375 0.96875 L 3.953125 0.96875 L 3.953125 -5.1875 L 0.84375 -5.1875 Z "/>
</symbol>
<symbol overflow="visible" id="glyph0-1">
<path style="stroke:none;" d="M 0.78125 -5.828125 L 1.84375 -5.828125 L 4.4375 -0.953125 L 4.4375 -5.828125 L 5.203125 -5.828125 L 5.203125 0 L 4.140625 0 L 1.546875 -4.875 L 1.546875 0 L 0.78125 0 Z "/>
</symbol>
<symbol overflow="visible" id="glyph0-2">
<path style="stroke:none;" d="M 0.78125 -5.828125 L 1.578125 -5.828125 L 1.578125 -3.4375 L 4.4375 -3.4375 L 4.4375 -5.828125 L 5.234375 -5.828125 L 5.234375 0 L 4.4375 0 L  
....

开发服务器 svg 在以文本形式查看时具有不同的结构,并显示以下行为:将其保存到文件后在浏览器中呈现:有效。将内容类型强制为 xhtml+xml 后在浏览器中呈现:有效。

不使用默认的 content-type 呈现内联。只显示字体。

svg 看起来像

<svg:svg version="1.1" baseProfile="full"
        xmlns:svg="http://www.w3.org/2000/svg"
        xmlns:xlink="http://www.w3.org/1999/xlink"
        xml:space="preserve" width="300px" height="300px" >
<svg:line x1="114.41" y1="132.42" x2="130.03" y2="146.44" stroke="rgb(0,0,0)" stroke-width="1"></svg:line>
<svg:line x1="113.56" y1="136.50" x2="126.06" y2="147.72" stroke="rgb(0,0,0)" stroke-width="1"></svg:line>

<svg:line x1="87.26" y1="137.68" x2="96.45" y2="142.94" stroke="rgb(0,0,255)" stroke-width="1"><

遗憾的是,使用 xhmtl+xml 会破坏我所有的 css 和 javascript(引导程序),因此无法使用。

I have tried the other suggested workarounds to get this svg rendered correctly during development did not work for me.

有没有办法让上面显示的 rdkit 库提供的内联 svg 在开发服务器中呈现而不使用 xhtml+xml 内容类型?

【问题讨论】:

  • 你能切换到你在生产中使用的相同版本的rdkit吗?无论如何,这是个好主意。开发服务器显然与此无关。
  • 我确实做到了..在 MacOSX 上使用 brew 并从 github "HEAD" 获取 rdkit,并在 Ubuntu 中从源代码编译。尽管 OSX 机器仍然给我上面给出的 svg。我认为 cairo 或我 Mac 中的其他一些库给了我不同的 svg 风格。
  • 我更改了标题,使其更加以 rdkit 和 svg 为中心

标签: python django google-chrome svg rdkit


【解决方案1】:

我相信浏览器不会在 text/html 文档中绘制此 SVG,因为它无法识别 svg XML 命名空间。您需要将 SVG 放在默认命名空间中。试试这个:

svg_string = svg_string.replace(u'svg:', u'').replace(u'xmlns:svg', u'xmlns')

这是一个足以满足您的开发需求的 hack,但是如果您想在生产环境中执行此操作,您应该使用 ElementTree 或任何其他 XML 库更正确地执行此操作。

【讨论】:

  • 谢谢瓦西里。一旦我按照您的建议强制命名空间,它就会起作用。感谢您的回复,我了解到问题出在 xml 命名空间上。也就是说,我正在使用“brew install --HEAD rdkit”重新安装 rdkit。我可能使用非“HEAD”R2013.09 运行开发,使用 github“HEAD”进行生产,解释了差异。现在,您的解决方法可以帮助一吨!我还想知道是什么在 rdkit 2013.09 和 HEAD (2d6945c0) 之间改变了 svg 的风格......很高兴知道为什么会在未来的此类问题上发生这种情况。此外,xhtml 化的 svg 实际上看起来更紧凑。
  • 另外让我印象深刻的是它与 xhtml+xml 内容类型一起工作而没有任何命名空间操作的原因是因为浏览器随后会为您适当地切换命名空间。我想知道是否有办法通过 cairo 要求 rdkit 在默认命名空间中返回 svg?
  • @harijay 正如您自己所说,这可能是由于开罗版本的差异。据我了解,rdkit 在 Cairo 画布上绘制,然后 Cairo 负责将其渲染为 SVG,因为它认为合适。
  • ..是的 ..我刚刚安装了 github HEAD 版本,还使用 ​​brew 在 OSX 开发机器上更新了我的 cairo——它仍在生成 xhtml 版本的 svg。我会看看是否可以从 rdkit 中控制这种行为? .或者我可能会坚持检测 svg 风格并适当更改它,因为我肯定无法使用 xhtml。
猜你喜欢
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2021-12-09
  • 2011-12-17
相关资源
最近更新 更多