كيف يمكنني الحصول على وكيل المستخدم البعيد داخل قالب Genshi عند استخدام TRAC، و WSGI؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

أحاول القيام ببعض تخصيص موقع إدارة مشروع TRAC واجهت مشكلة مثيرة للاهتمام. يحتوي المشروع على مجموعة من الصور التي هي كل من SVG و PNG. تحتوي صور SVG على مزايا عديدة بما في ذلك ارتباطات تشعبية متعددة وحجم أصغر من PNG وهو أكبر ويمكن أن يرتبط فقط بمستند واحد.

أدرك أنه من الممكن استخدام jQuery لإخفاء وكيل المستخدم بعد تحميل الصفحة واستبدال PNG مع إصدار SVG من الصورة، ولكن هذا يؤدي إلى إرسال PNG إلى جميع العملاء. يمكنني أيضا الحصول على Genshi استبدال PNG باستخدام SVG لجميع العملاء، ثم استخدم JQuery لوضع PNG مرة أخرى، ولكن النتائج نفس المشكلة. يمكنني استخدام JQUERY لإدراج الصور المناسبة لجميع العملاء، ولكن يبدو أن هذا فقط سخيفا يتطلب من العميل القيام بما يجب عليه الخادم.

هل هناك طريقة يمكنني الحصول على معلومات المتصفح داخل قالب Genshi؟ إنه أكثر صعوبة قليلا من مجرد الدعوة إلى متغيرات البيئة بسبب حقيقة أنني أقوم بتشغيل TRAC باستخدام WSGI. لقد نظرت من خلال إخراج repr(locals()) ولم ير شيئا يبدو أنه حل مشكلتي. أود أيضا تجنب تعديل التعليمات البرمجية المصدر TRAC.

هل كانت مفيدة؟

المحلول 2

حسنا، لذلك قمت ببعض الحفر حول هذه القضية، وليس عن طريق التآمر من خلال التعليمات البرمجية المصدر، ولكن عن طريق كتابة معالج Genshi مخصص يقوم ببصق العودية repr() من كل عنصر في السكان المحليين (مع المساعدة المقدمة من قبل السؤال السابق التي تناولت كيفية طباعة جميع المتغيرات في نطاق). لقد فاتني في الأصل req هدف. يبدو أنه بسيط مثل استخدام req.environ['HTTP_USER_AGENT']. وبعد كانت المشكلة في العثور على req كائن في المقام الأول. التموين من خلال التعليمات البرمجية المصدر، ما زلت غير قادر على العثور على مكان مثيل للقوالب، لذلك يثبت أن هذا أسهل وأفضل من التصحيح.

للتأكد من اكتمال، إليك القليل من قالب Genshi الذي اعتدت أن استبدل الشعار فقط للحصول على إصدارات أحدث من المتصفحات القائمة على Gecko. إنها القليل من الاختراق وربما غير متهمين، لكنها تعمل ولا ترسل SVG إلى المتصفحات التي تكمن وتقول إنها "مثل أبو بريص" ولكن لا يمكنني تقديم 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

راجع للشغل، ربما يجب أن ننظر في HTTP_ACCEPT رأس بدلا من HTTP_USER_AGENT لمعرفة ما يجب إرسال التمثيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top