Como faço para obter o agente usuário remoto dentro de um modelo de Genshi ao usar Trac e WSGI?
Pergunta
Eu estou tentando fazer alguma personalização de um site de gerenciamento de projeto Trac e ter executado em um problema interessante. O projeto tem um conjunto de imagens que são SVG e PNG. As imagens SVG tem inúmeras vantagens, incluindo vários hiperlinks e um tamanho transmitida menor contra PNG que é maior e só pode conectar-se a um único documento.
Eu percebo que é possível usar jQuery para farejar o agente do usuário após a página ter sido carregada e substituir o PNG com a versão SVG da imagem, mas isso resulta no PNG sendo enviado para todos os clientes. Eu também pode ter Genshi substituir o PNG com SVG para todos os clientes e, em seguida, usar jQuery para colocar a parte de trás PNG, mas os mesmos resultados de problema. Eu poderia usar jQuery para inserir as imagens apropriadas para todos os clientes, mas que apenas parece bobo para exigir o cliente para fazer o que o servidor deve.
Existe uma maneira eu posso obter informações sobre o navegador dentro de um modelo Genshi? É um pouco mais difícil do que apenas chamar para variáveis ??de ambiente por causa do fato de que eu estou correndo Trac usando WSGI. Eu olhei através da saída de repr(locals())
e não vi nada que parecia que resolveu o meu problema. Eu também gostaria de evitar modificar o código-fonte Trac.
Solução 2
Ok, então eu fiz alguma escavação sobre a questão, e não por grepping através do código-fonte, mas escrevendo um manipulador Genshi personalizado que cuspir o repr()
recursiva de cada elemento em locais (com a ajuda fornecido por um previous questão que abordou como imprimir todas as variáveis ??no escopo). Eu tinha originalmente perdeu o objeto req
. Parece que ele é tão simples quanto usar req.environ['HTTP_USER_AGENT']
. O problema estava em encontrar o objeto req
em primeiro lugar. Grepping através do código fonte que eu ainda não consigo encontrar exatamente onde os modelos são instanciados, então isso prova ser muito mais fácil e melhor do que um patch.
Para completar, aqui está a pouco de template Genshi I usado para substituir o logotipo apenas para versões mais recentes dos navegadores baseados Gecko. É um pouco hacky e provavelmente abaixo do ideal, mas funciona e não enviar SVG para navegadores que mentir e dizer que eles são "como Gecko", mas não pode tornar SVG corretamente - sim, eu estou olhando para você 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>
Outras dicas
user_agent = environ.get('HTTP_USER_AGENT', None)
Ou se environ
é envolvido em algum tipo de objeto Request
:
user_agent = request.user_agent
btw, você provavelmente deve olhar para cabeçalho HTTP_ACCEPT
vez de HTTP_USER_AGENT
para descobrir o que a representação deve ser enviada.