【问题标题】:How do I get the remote user agent inside a Genshi template when using Trac, and WSGI?使用 Trac 和 WSGI 时,如何在 Genshi 模板中获取远程用户代理?
【发布时间】:2009-12-06 14:46:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: python trac wsgi genshi


    【解决方案1】:
    user_agent = environ.get('HTTP_USER_AGENT', None)
    

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

    user_agent = request.user_agent
    

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

    【讨论】:

    • 是的,在 CGI 环境或 WSGI 应用程序内部我可以这样做,但 environ 在 Genshi 内部是空的,我无法确定请求对象在何处/是否传递给 Genshi来自 Trac/WSGI。此外,HTTP_ACCEPT 可能是不行的,因为有些浏览器撒谎说他们可以接受 SVG,但做得很差——我在看着你 Chrome!巨大的白框作为背景是什么?
    • @Pridkett: grep 模板名称的 trac 源并在渲染代码中传递所需的变量。
    • 我试图避免更改 Trac 源代码。我已经走这条路太多次了,我真的不想担心管理各种补丁——即使是非常简单的补丁。
    【解决方案2】:

    好的,所以我对这个问题进行了一些挖掘,不是通过 grep 查看源代码,而是通过编写一个自定义 Genshi 处理程序,该处理程序吐出 locals 中每个元素的递归 repr()(在 @987654321 提供的帮助下) @ 解决了如何打印范围内的所有变量)。我最初错过了req 对象。看起来就像使用req.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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 2016-12-19
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多