Jinja: يتم تخزين القوالب التي تم استيرادها مؤقتًا لفترة طويلة جدًا

تم إنشاؤها على ١٦ يوليو ٢٠١٣  ·  4تعليقات  ·  مصدر: pallets/jinja

لدي نموذج يسمى main.html. {٪ تستورد٪} وحدة تسمى module_a (بدون سياق). module_a {٪ يستورد٪} module_b بنفس الطريقة.

عندما أقوم بتغيير module_a ، يتعرف مُحمل القالب على هذا ويعيد تحميله.

عندما أقوم بتغيير module_b ، فإن أداة تحميل النماذج لا تتعرف عليها. لا بد لي من إعادة العملية.

أعتقد أن هذا يرجع إلى حقيقة أن الكود الذي تم إنشاؤه لـ module_a يقوم بالاستيراد في دالة الجذر () الخاصة به. يرى get_template أن module_a محدَّث ، لذا لا تعيد تحميله ، لذلك لا يُعيد تشغيل وظيفة root () الخاصة به.

لست متأكدًا من كيفية معالجة هذا. من الواضح أن استدعاء root () في كل استدعاء لـ get_template يعد أمرًا سيئًا. سيكون الحل الأمثل هو تتبع تبعيات كل قالب ، ولكن هذا يتطلب الكثير من العمل.

التعليق الأكثر فائدة

المشكلة هي أن الواردات مخزنة مؤقتًا ولكن لا يتم تعقبها. لست متأكدًا من أفضل طريقة للتعامل مع هذا الأمر.

ال 4 كومينتر

نحن نواجه هذا أيضًا. (لم أجد هذا الخطأ تقريبًا لأنك لم تستخدم المصطلح auto_reload - هذا ينطبق فقط عندما auto_reload=True ).

يبدو أنه سيكون من الصعب جدًا إصلاح هذا ؛ من الناحية المثالية ، قد ترغب في إرجاع طريقة uptodate من get_source للتحقق ليس فقط من الملف المصدر نفسه ، ولكن أيضًا أي ملف مصدر تقوم باستيراده أو توسيعه أو تضمينه. ولكن في الوقت الذي يتم فيه تحديد uptodate ، كل ما لديك هو المصدر الأولي غير المحلل ، وبالتالي فإن هذه المعلومات غير متاحة.

قد يكون قابلاً للتنفيذ على مستوى أعلى (على سبيل المثال في Template.is_up_to_date ) ولكن يبدو أنه سيتطلب أيضًا عملية جراحية كبيرة لاستعادة معلومات التبعية من المترجم.

أنا فقط واجهت هذا أيضا. هذا أمر مزعج جدًا في التطوير لأنه يعني أنه يجب علي تعيين cache_size إلى 0 ، ثم تصبح الأمور بطيئة جدًا (كما يمكن أن يتوقع المرء).

سأحاول البحث في الأجزاء الداخلية لمعرفة ما إذا كنت قد توصلت إلى شيء ما. في غضون ذلك ، إذا كان بإمكان شخص لديه خبرة أكبر أن يقترح حلًا أو حتى بعض التوجيهات ، فسيكون ذلك رائعًا حقًا!

المشكلة هي أن الواردات مخزنة مؤقتًا ولكن لا يتم تعقبها. لست متأكدًا من أفضل طريقة للتعامل مع هذا الأمر.

حسنًا ، لا تتعلق المشكلة هنا بالتخزين المؤقت للقالب ولكن في التخزين المؤقت للمتغيرات التي تم تمريرها إلى وحدات الماكرو المستوردة.
(على الأقل في حالتي)

كان الحل البديل الخاص بي هو استخدام طريقة تُرجع قيم السياق المحدثة ليتم عرضها.

في السيناريو الخاص بي كنت أقوم بعمل ماكرو لتقسيم الصفحات. يحتاج الماكرو إلى كائن الطلب.

النهج الأولي داخل الماكرو
{% set pagenum, limit = request.args.pg , request.args.limit %}
سيعمل هذا في البداية ، ولكن في الطلبات اللاحقة ، يتم تخزين قيم سياق الماكرو مؤقتًا إلى الأبد ما لم يتم إعادة تمهيد الخادم

نهج العمل داخل الماكرو
{% set pagenum, limit = request.get_params() %}
سيعيد هذا الآن معلمات الطلب المحدثة الخاصة بي في كل مكالمة دون التضحية بالتخزين المؤقت لوحدات الماكرو الخاصة بي.

لقد لاحظت أيضًا أن التخزين المؤقت لوحدات الماكرو له سرعة تصل إلى 2.5 × تقريبًا في أوقات الاستجابة.
بدون تخزين مؤقت ~ = 450 مللي ثانية
مع التخزين المؤقت ~ = 150 مللي ثانية

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات