TRAC 및 WSGI를 사용할 때 원격 사용자 에이전트를 Genshi 템플릿 내부에 넣는 방법은 무엇입니까?

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

  •  13-09-2019
  •  | 
  •  

문제

TRAC 프로젝트 관리 웹 사이트를 사용자 정의하려고 노력하고 있으며 흥미로운 문제가 발생했습니다. 이 프로젝트에는 SVG와 PNG의 이미지 세트가 있습니다. SVG 이미지는 다수의 하이퍼 링크와 PNG에 대한 작은 전송 크기를 포함하여 수많은 장점이 있으며, 이는 더 크고 단일 문서에만 연결할 수 있습니다.

페이지가로드 된 후 jQuery를 사용하여 사용자 에이전트를 스니핑하고 PNG를 이미지의 SVG 버전으로 바꾸는 것이 가능하지만 PNG가 모든 클라이언트에게 전송됩니다. 또한 Genshi가 모든 클라이언트의 SVG로 PNG를 교체 한 다음 jQuery를 사용하여 PNG를 다시 넣을 수 있지만 동일한 문제 결과가 발생할 수 있습니다. jQuery를 사용하여 모든 클라이언트에 적절한 이미지를 삽입 할 수 있지만 클라이언트가 서버가해야 할 일을 수행 해야하는 것이 어리석은 것 같습니다.

Genshi 템플릿 내에서 브라우저 정보를 얻을 수있는 방법이 있습니까? WSGI를 사용하여 TRAC를 실행하고 있기 때문에 환경 변수를 요구하는 것보다 조금 더 어렵습니다. 나는 출력을 살펴 보았다 repr(locals()) 그리고 그것이 내 문제를 해결 한 것처럼 보이는 것을 보지 못했습니다. 또한 TRAC 소스 코드 수정을 피하고 싶습니다.

도움이 되었습니까?

해결책 2

좋아, 그래서 나는 소스 코드를 통과하는 것이 아니라 재귀를 뱉어내는 사용자 정의 Genshi 핸들러를 작성함으로써 문제를 파헤 쳤다. repr() 현지인의 모든 요소 중 이전 질문 모든 변수를 범위로 인쇄하는 방법을 다루었습니다). 나는 원래 그것을 놓쳤다 req 물체. 사용만큼 간단한 것 같습니다 req.environ['HTTP_USER_AGENT']. 문제는 req 처음에 물체. 소스 코드를 통해 템플릿이 인스턴스화되는 위치를 정확히 찾을 수 없으므로 패치보다 훨씬 쉽고 나은 것으로 판명됩니다.

완전성을 위해 여기에 최신 버전의 Gecko 기반 브라우저에 대해서만 로고를 대체하는 데 사용한 Genshi 템플릿이 있습니다. 그것은 약간 해킹되고 아마도 차선책이지만, 그것은 작동하며, 그것은 SVG를 브라우저로 보내지 않고 "Gecko와 같은"브라우저를 보내지 않지만 SVG를 제대로 렌더링 할 수는 없습니다. 예, 나는 당신을 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>

다른 팁

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

또는 만약 environ 어떤 종류의로 싸여 있습니다 Request 물체:

user_agent = request.user_agent

BTW, 당신은 아마 볼 것입니다 HTTP_ACCEPT 대신 헤더 HTTP_USER_AGENT 어떤 진술을 보내야하는지 알아 보려면

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top