Как получить удаленный пользовательский агент внутри шаблона Genshi при использовании Trac и WSGI?

Я пытаюсь настроить сайт управления проектами Trac и столкнулся с интересной проблемой. В проекте есть набор изображений как SVG, так и PNG. Изображения SVG имеют множество преимуществ, включая множественные гиперссылки и меньший передаваемый размер по сравнению с PNG, который больше и может ссылаться только на один документ.

Я понимаю, что можно использовать jQuery для прослушивания пользовательского агента после загрузки страницы и замены PNG версией изображения SVG, но в результате PNG отправляется всем клиентам. Я также могу сделать так, чтобы Genshi заменил PNG на SVG для всех клиентов, а затем использовал jQuery для возврата PNG, но в результате возникла та же проблема. Я мог бы использовать jQuery для вставки соответствующих изображений для всех клиентов, но это просто глупо требовать от клиента делать то, что должен делать сервер.

Есть ли способ получить информацию о браузере внутри шаблона Genshi? Это немного сложнее, чем просто вызывать переменные окружения, потому что я использую Trac с использованием WSGI. Я просмотрел вывод repr(locals()) и не видел ничего, что выглядело так, как будто бы это решило мою проблему Я также хотел бы избежать изменения исходного кода Trac.

2 ответа

Решение

Итак, я немного покопался в проблеме, не разбирая исходный код, а написав собственный обработчик Genshi, который выплевывает рекурсив repr() каждого элемента в локальных (с помощью предыдущего вопроса, который касался того, как распечатать все переменные в области). Я изначально пропустил req объект. Похоже, это так же просто, как с помощью req.environ['HTTP_USER_AGENT'], Проблема была в том, чтобы найти req Объект на первом месте. Просматривая исходный код, я до сих пор не могу точно определить, где создаются шаблоны, так что это оказывается намного проще и лучше, чем патч.

Для полноты, вот немного шаблона Genshi, который я использовал для замены логотипа только для более новых версий браузеров на базе Gecko. Это немного хакерский и, вероятно, неоптимальный вариант, но он работает, и он не отправляет 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>
user_agent = environ.get('HTTP_USER_AGENT', None)

Или если environ завернут в какой-то Request объект:

user_agent = request.user_agent

Кстати, вы должны, вероятно, посмотреть на HTTP_ACCEPT заголовок вместо HTTP_USER_AGENT выяснить, какое представление следует отправить.

Другие вопросы по тегам