Come faccio a ottenere l'agente utente remoto all'interno di un modello di Genshi quando si utilizza Trac, e WSGI?
Domanda
Sto cercando di fare un po 'di personalizzazione di un sito web di gestione del progetto Trac ed ho incontrato un problema interessante. Il progetto ha una serie di immagini che sono sia SVG e PNG. Le immagini SVG hanno numerosi vantaggi, tra cui molteplici collegamenti ipertestuali e una dimensione più piccola trasmessa contro PNG che è più grande e può collegarsi solo a un singolo documento.
Mi rendo conto che è possibile utilizzare jQuery per fiutare il programma utente dopo che la pagina è stata caricata e sostituire il PNG con la versione SVG dell'immagine, ma questo si traduce in PNG di essere inviato a tutti i clienti. Ho anche possibile avere Genshi sostituire il PNG con SVG per tutti i clienti e quindi utilizzare jQuery per mettere il PNG indietro, ma gli stessi risultati problema. Potrei usare jQuery per inserire le immagini appropriate per tutti i clienti, ma che sembra solo stupido di richiedere al cliente di fare ciò che il server dovrebbe.
C'è un modo per ottenere informazioni sul browser all'interno di un modello di Genshi? E 'un po' più difficile che solo chiedendo le variabili d'ambiente a causa del fatto che sto correndo Trac usando WSGI. Ho guardato attraverso l'uscita di repr(locals())
e non ho visto niente che sembrava risolto il mio problema. Vorrei anche per evitare di modificare il codice sorgente Trac.
Soluzione 2
Va bene, così ho fatto un po 'scavare sulla questione, non dal grep attraverso il codice sorgente, ma scrivendo un gestore Genshi personalizzato che sputare il repr()
ricorsiva di ogni elemento a gente del posto (con l'aiuto fornito da un previous che ha affrontato come stampare tutte le variabili di portata). Avevo inizialmente perso l'oggetto req
. Sembra che sia semplice come usare req.environ['HTTP_USER_AGENT']
. Il problema era di trovare l'oggetto req
in primo luogo. Grep attraverso il codice sorgente non riesco ancora a trovare esattamente dove sono istanziati i modelli, quindi questo dimostra di essere molto più facile e meglio di una patch.
Per completezza, ecco il pezzo di modello Genshi ho usato per sostituire il logo solo per le versioni più recenti del browser basati su Gecko. E 'un po' hacky e probabilmente non ottimale, ma funziona e non invia SVG per i browser che mentire e dire che sono "come Gecko", ma non può rendere SVG correttamente - sì, sto guardando a voi 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>
Altri suggerimenti
user_agent = environ.get('HTTP_USER_AGENT', None)
Se environ
è avvolto in una sorta di oggetto Request
:
user_agent = request.user_agent
A proposito, probabilmente si dovrebbe guardare al di intestazione HTTP_ACCEPT
invece di HTTP_USER_AGENT
per scoprire cosa la rappresentanza deve essere inviato.