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

StackOverflow https://stackoverflow.com/questions/1855576

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение 2

Итак, я немного покопался в этой проблеме, не просматривая исходный код, а написав собственный обработчик Genshi, который выдает рекурсивные repr() каждого элемента в locals (с помощью предыдущий вопрос в нем говорилось о том, как распечатать все переменные в области видимости).Я изначально пропустил 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 чтобы узнать, какое представление следует отправить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top