Como faço para obter o agente usuário remoto dentro de um modelo de Genshi ao usar Trac e WSGI?

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

  •  13-09-2019
  •  | 
  •  

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.

Foi útil?

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] &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>

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top