كيف يمكنني الحصول على وكيل المستخدم البعيد داخل قالب Genshi عند استخدام TRAC، و WSGI؟
سؤال
أحاول القيام ببعض تخصيص موقع إدارة مشروع 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] > 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
لمعرفة ما يجب إرسال التمثيل.