Как получить удаленный пользовательский агент внутри шаблона 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] > 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
выяснить, какое представление следует отправить.