使用Trac和WSGI时,如何在Genshi模板中获取远程用户代理?

时间:2009-12-06 14:46:38

标签: python trac wsgi genshi

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

我意识到可以在页面加载后使用jQuery嗅出用户代理,并用图像的SVG版本替换PNG,但这会导致PNG被发送到所有客户端。我也可以让Genshi用所有客户端的SVG替换PNG,然后使用jQuery将PNG放回去,但同样的问题也会产生。我可以使用jQuery为所有客户端插入适当的图像,但要求客户端执行服务器应该做的事情似乎很愚蠢。

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

2 个答案:

答案 0 :(得分:0)

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

或者environ是否包含在某种Request对象中:

user_agent = request.user_agent

btw,您应该查看HTTP_ACCEPT标题而不是HTTP_USER_AGENT,以找出应该发送的代码。

答案 1 :(得分:0)

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

为了完整性,这里有一些Genshi模板我用来替换基于Gecko的浏览器的新版本的徽标。它有点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>