1

我正在尝试对 Trac 项目管理网站进行一些定制,但遇到了一个有趣的问题。该项目有一组 SVG 和 PNG 的图像。SVG 图像具有许多优点,包括多个超链接和较小的传输大小,而 PNG 较大且只能链接到单个文档。

我意识到可以在页面加载后使用 jQuery 嗅探用户代理并将 PNG 替换为 SVG 版本的图像,但这会导致 PNG 被发送到所有客户端。我也可以让 Genshi 将所有客户端的 PNG 替换为 SVG,然后使用 jQuery 将 PNG 放回原处,但结果相同。我可以使用 jQuery 为所有客户端插入适当的图像,但是要求客户端执行服务器应该执行的操作似乎很愚蠢。

有没有办法可以在 Genshi 模板中获取浏览器信息?由于我正在使用 WSGI 运行 Trac,因此这比仅调用环境变量要困难一些。我查看了的输出repr(locals())并没有看到任何看起来解决了我的问题的东西。我还想避免修改 Trac 源代码。

4

2 回答 2

0
user_agent = environ.get('HTTP_USER_AGENT', None)

或者如果environ被包裹在某种Request对象中:

user_agent = request.user_agent

顺便说一句,您可能应该查看HTTP_ACCEPT标头而不是HTTP_USER_AGENT找出应该发送的表示形式。

于 2009-12-06T15:09:49.077 回答
0

好的,所以我对这个问题进行了一些挖掘,不是通过 grep 源代码,而是通过编写一个自定义 Genshi 处理程序,该处理程序吐出本地每个元素的递归(在前面的问题repr()提供的帮助下,解决了如何打印范围内的所有变量)。我最初错过了这个对象。看起来就像使用. 问题在于首先要找到对象。通过源代码搜索,我仍然无法找到模板实例化的确切位置,因此这被证明比补丁更容易和更好。reqreq.environ['HTTP_USER_AGENT']req

为了完整起见,这里是我用来替换基于 Gecko 的较新版本浏览器的徽标的 Genshi 模板。这有点 hacky 并且可能不是最理想的,但它可以工作并且它不会将 SVG 发送到那些撒谎并说它们“像 Gecko”但不能正确呈现 SVG 的浏览器——是的,我正在看你的 Webkit。

<py:if test="'Gecko/' in req.environ['HTTP_USER_AGENT'] and [int(x.split('/')[1]) for x in req.environ['HTTP_USER_AGENT'].split() if x.startswith('Gecko')][0] &gt; 20080101">
  <div py:match="div[@id='header']">
    <object type="image/svg+xml" id="svgLogo" data="${href.chrome('site/logo.svg')}" style="width=${chrome['logo']['width']}px; height=${chrome['logo']['height']}px;"></object>
  </div>
</py:if>
于 2009-12-07T14:16:28.260 回答