Jinja: تم استيراد / عرض النموذج مرتين

تم إنشاؤها على ١٦ ديسمبر ٢٠١٤  ·  5تعليقات  ·  مصدر: pallets/jinja

لقد بدأت للتو مع jinja2 وواجهت مشكلة غريبة حقًا ، تم وصفها أيضًا في القضية رقم 255 (مغلقة ، لكن لم يكن هناك متابعة من قبل المراسل).

أنا على نظام التشغيل Windows 7 x64 الذي يعمل بنظام Python 3.4.1
لقد قمت بتثبيت jinja2 مع "easy_install Jinja2"

لدي ... jinja2-testjinja2-test.py تحتوي على هذا:

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('jinja2-test', 'templates'))

template = env.get_template('mytemplate.html')

print(env.list_templates())
print(template.render(the='variables', go='here'))

ونموذج ... jinja2-testtemplatesmytemplate.html

<html>
<head></head>

<body>
    <h1>Rendered template</h1>
    This template shows that the {{ the }} go {{ go }}
</body>

</html>

في سطر الأوامر الذي أفعله: python jinja2-test.py والقوالب مدرجة وعرضها مرتين:

...\jinja2-test> python jinja2-test.py
['mytemplate.html']
<html>
<head></head>

<body>
    <h1>Rendered template</h1>
    This template shows that the variables go here
</body>

</html>
['mytemplate.html']
<html>
<head></head>

<body>
    <h1>Rendered template</h1>
    This template shows that the variables go here
</body>

</html>

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

واجهت نفس المشكلة على قوس لينكس مع بيثون 3.4.2

يقوم مُنشئ PackageLoader بتشغيل البرنامج النصي بالكامل مرة ثانية ، وليس نسختين من النسخ في البرنامج النصي نفسه.
استخدم FileSystemLoader بدلاً من ذلك وهو يعمل بشكل جيد:

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))

كانت الوثائق مضللة بعض الشيء ؛)

ال 5 كومينتر

بالنظر إلى كيفية طباعة ['mytemplate.html'] مرتين أيضًا ، يبدو إلى حد كبير أن البرنامج النصي الخاص بك يحتوي على عبارتين طباعة من كل نوع ... لقد جربته على كل من Linux و Windows ولا يمكنني إعادة إنتاجه.

إذا كان بإمكانك إعادة إنتاجها ، فالرجاء إنشاء نموذج اختبار كامل يوضح المشكلة (ووضعها على سبيل المثال في Git repo).

واجهت نفس المشكلة على قوس لينكس مع بيثون 3.4.2

يقوم مُنشئ PackageLoader بتشغيل البرنامج النصي بالكامل مرة ثانية ، وليس نسختين من النسخ في البرنامج النصي نفسه.
استخدم FileSystemLoader بدلاً من ذلك وهو يعمل بشكل جيد:

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))

كانت الوثائق مضللة بعض الشيء ؛)

لدي نفس المشكلة على Ubuntu 14.04 مع Python 2.7.11 و Jinja2 2.8 و Flask 0.11.1.
وأنا متأكد من أن الكود الخاص بي يعمل مرة واحدة فقط!

ملاحظة : هذا يحدث فقط عندما أفتح بعض الصفحات لأول مرة بعد إعادة تشغيل الخادم! عندما أقوم بتحديث الصفحة - يتم تحميل القوالب مرة واحدة.

هذا يعادل إنشاء ملف example.py يقوم باستيراد نفسه:

data = "foo"

import example

print(data)

يستورد $ python example.py أولاً example كـ __main__ ، ثم يستورد نفسه كـ example . نظرًا للطريقة التي تعمل بها ذاكرة التخزين المؤقت للاستيراد ، ينتج عن ذلك تنفيذان للوحدة النمطية. هذا مجرد Python ، إنه ليس شيئًا يمكن لـ Jinja فعل أي شيء حياله.

إذا قمت بإعداد حزمة حقيقية بـ __init__.py وقمت بتشغيلها كوحدة نمطية ، أو كنقطة دخول ، فلن يحدث هذا. أو ضع الكود الرئيسي في كتلة if __name__ == "__main__": .

واجهت نفس المشكلة على قوس لينكس مع بيثون 3.4.2

يقوم مُنشئ PackageLoader بتشغيل البرنامج النصي بالكامل مرة ثانية ، وليس نسختين من النسخ في البرنامج النصي نفسه.
استخدم FileSystemLoader بدلاً من ذلك وهو يعمل بشكل جيد:

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))

كانت الوثائق مضللة بعض الشيء ؛)

我 也是 这样 解决 的

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