Comment puis-je obtenir l'agent utilisateur distant dans un modèle Genshi lors de l'utilisation Trac et WSGI?

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

  •  13-09-2019
  •  | 
  •  

Question

Je suis en train de faire un peu de personnalisation d'un site web de gestion de projet Trac et se sont heurtées à un problème intéressant. Le projet dispose d'un ensemble d'images qui sont à la fois SVG et PNG. Les images SVG présentent de nombreux avantages, y compris plusieurs hyperliens et une plus petite taille qui PNG transmises contre est plus grand et ne peut créer un lien vers un seul document.

Je me rends compte qu'il est possible d'utiliser jQuery pour flairer l'agent utilisateur après que la page a été chargée et remplacer le PNG avec la version SVG de l'image, mais cela se traduit par le PNG envoyé à tous les clients. Je peux aussi Genshi remplacer le PNG avec SVG pour tous les clients, puis utiliser jQuery pour remettre le PNG, mais les mêmes résultats problème. Je pourrais utiliser jQuery pour insérer les images appropriées pour tous les clients, mais tout semble ridicule d'exiger du client de faire ce que le serveur doit.

Y at-il une manière que je peux obtenir des informations de navigateur à l'intérieur d'un modèle Genshi? Il est un peu plus difficile que simplement appeler des variables d'environnement en raison du fait que je suis en Trac utilisant WSGI. Je l'ai regardé à travers la sortie de repr(locals()) et ne vois rien qui semblait résolu mon problème. Je voudrais aussi éviter de modifier le code source Trac.

Était-ce utile?

La solution 2

Ok, donc je l'ai fait quelques recherches sur la question, et non par grep à travers le code source, mais en écrivant un gestionnaire Genshi personnalisé qui crachent le repr() récursive de chaque élément dans la population locale (avec l'aide fournie par un previous qui portait sur la façon d'imprimer toutes les variables de portée). J'avais initialement manqué l'objet req. On dirait qu'il est aussi simple que l'utilisation req.environ['HTTP_USER_AGENT']. Le problème était de trouver l'objet req en premier lieu. Par le code grepper source que je ne trouve toujours pas exactement où les modèles sont instanciés, donc cela se révèle être beaucoup plus facile et mieux qu'un patch.

Pour être complet, voici le peu de modèle Genshi j'ai utilisé pour remplacer le logo uniquement pour les versions plus récentes des navigateurs basés sur Gecko. Il est un peu hacky et probablement suboptimale, mais il fonctionne et il ne transmet pas SVG aux navigateurs qui mentent et disent qu'ils sont « comme Gecko », mais ne peuvent pas rendre correctement SVG - oui, je vous regarde 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>

Autres conseils

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

Ou si environ est enveloppé dans une sorte d'objet Request:

user_agent = request.user_agent

BTW, vous devriez probablement à en-tête de HTTP_ACCEPT au lieu de HTTP_USER_AGENT pour savoir ce qui doit être envoyé représentation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top