1

Trac プロジェクト管理 Web サイトをカスタマイズしようとしていますが、興味深い問題に遭遇しました。プロジェクトには、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

repr()さて、ソースコードをgrepするのではなく、ローカルのすべての要素の再帰を吐き出すカスタムGenshiハンドラーを作成することで、問題を掘り下げました(印刷方法に関する以前の質問で提供された助けを借りて)スコープ内のすべての変数)。req私はもともとオブジェクトを見逃していました。を使用するのと同じくらい簡単に見えますreq.environ['HTTP_USER_AGENT']req問題は、そもそもオブジェクトを見つけることでした。ソース コードを調べても、テンプレートがインスタンス化されている正確な場所をまだ見つけることができないため、これはパッチよりもはるかに簡単で優れていることがわかります。

完全を期すために、Gecko ベースのブラウザーの新しいバージョンのロゴのみを置き換えるために使用した Genshi テンプレートの一部を次に示します。少しハックで、おそらく最適ではありませんが、機能し、「Gecko のような」と嘘をつき、SVG を適切にレンダリングできないブラウザーに SVG を送信しません。

<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 に答える