¿Cómo consigo el agente de usuario remoto dentro de una plantilla de Genshi cuando uso Trac y WSGI?

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

  •  13-09-2019
  •  | 
  •  

Pregunta

Estoy intentando personalizar un sitio web de gestión de proyectos de Trac y me he encontrado con un problema interesante.El proyecto tiene un conjunto de imágenes que son tanto SVG como PNG.Las imágenes SVG tienen numerosas ventajas, incluidos múltiples hipervínculos y un tamaño de transmisión más pequeño frente a PNG, que es más grande y solo puede vincularse a un único documento.

Me doy cuenta de que es posible usar jQuery para detectar el agente de usuario después de que se haya cargado la página y reemplazar el PNG con la versión SVG de la imagen, pero esto da como resultado que el PNG se envíe a todos los clientes.También puedo hacer que Genshi reemplace el PNG con SVG para todos los clientes y luego usar jQuery para volver a colocar el PNG, pero surge el mismo problema.Podría usar jQuery para insertar las imágenes apropiadas para todos los clientes, pero parece una tontería exigir que el cliente haga lo que debería hacer el servidor.

¿Hay alguna manera de obtener información del navegador dentro de una plantilla de Genshi?Es un poco más difícil que simplemente solicitar variables de entorno debido al hecho de que estoy ejecutando Trac usando WSGI.He revisado la salida de repr(locals()) y no vi nada que pareciera que resolvió mi problema.También me gustaría evitar modificar el código fuente de Trac.

¿Fue útil?

Solución 2

Bien, investigué un poco el problema, no revisando el código fuente, sino escribiendo un controlador Genshi personalizado que escupe el código recursivo. repr() de cada elemento en los locales (con la ayuda de un Pregunta anterior que abordaba cómo imprimir todas las variables dentro del alcance).Originalmente me había perdido el req objeto.Parece que es tan simple como usar req.environ['HTTP_USER_AGENT'].El problema estaba en encontrar el req objeto en primer lugar.Revisando el código fuente todavía no puedo encontrar exactamente dónde se crean instancias de las plantillas, por lo que esto demuestra ser mucho más fácil y mejor que un parche.

Para completar, aquí está la parte de la plantilla de Genshi que usé para reemplazar el logotipo solo para las versiones más nuevas de los navegadores basados ​​en Gecko.Es un poco complicado y probablemente subóptimo, pero funciona y no envía SVG a navegadores que mienten y dicen que son "como Gecko" pero que no pueden representar SVG correctamente. Sí, te estoy mirando 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>

Otros consejos

user_agent = environ.get('HTTP_USER_AGENT', None)

O si environ está envuelto en algún tipo de objeto Request:

user_agent = request.user_agent

por cierto, probablemente debería mirar en la cabecera HTTP_ACCEPT en lugar de HTTP_USER_AGENT para averiguar lo que la representación debe ser enviada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top