Jinja: Template diimpor/dirender dua kali

Dibuat pada 16 Des 2014  ·  5Komentar  ·  Sumber: pallets/jinja

Saya baru saja memulai dengan jinja2 dan saya mengalami masalah yang sangat aneh, juga dijelaskan pada masalah #255 (ditutup, tetapi tidak ada tindak lanjut oleh reporter).

Saya menggunakan Windows 7 x64 menjalankan Python 3.4.1
Saya menginstal jinja2 dengan "easy_install Jinja2"

Saya memiliki ...jinja2-testjinja2-test.py yang berisi ini:

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'))

dan sebuah template ...jinja2-testtemplatesmytemplate.html

<html>
<head></head>

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

</html>

pada baris perintah yang saya lakukan: python jinja2-test.py dan templat terdaftar dan dirender dua kali:

...\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>

Komentar yang paling membantu

Punya masalah yang sama di arch linux dengan python 3.4.2

Konstruktor PackageLoader menjalankan seluruh skrip untuk kedua kalinya, bukan 2 cetakan dalam skrip itu sendiri.
Gunakan FileSystemLoader sebagai gantinya dan berfungsi dengan baik:

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

Dokumentasinya agak menyesatkan di sana;)

Semua 5 komentar

Melihat bagaimana ['mytemplate.html'] juga dicetak dua kali, sepertinya skrip Anda berisi dua pernyataan cetak dari setiap jenis... Saya sudah mencobanya di Linux dan Windows dan tidak dapat mereproduksinya.

Jika Anda dapat mereproduksinya, silakan buat testcase lengkap yang menunjukkan masalah tersebut (dan taruh misalnya di repo Git).

Punya masalah yang sama di arch linux dengan python 3.4.2

Konstruktor PackageLoader menjalankan seluruh skrip untuk kedua kalinya, bukan 2 cetakan dalam skrip itu sendiri.
Gunakan FileSystemLoader sebagai gantinya dan berfungsi dengan baik:

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

Dokumentasinya agak menyesatkan di sana;)

Saya memiliki masalah yang sama di Ubuntu 14.04 dengan Python 2.7.11, Jinja2 2.8 dan Flask 0.11.1.
Dan saya yakin kode saya hanya berjalan sekali!

Catatan : ini hanya terjadi ketika saya membuka beberapa halaman pertama kali setelah restart server! Ketika saya memperbarui halaman - templat dimuat sekali.

Ini sama dengan membuat file example.py yang mengimpor sendiri:

data = "foo"

import example

print(data)

python example.py pertama mengimpor example sebagai __main__ , kemudian mengimpor dirinya sendiri sebagai example . Karena cara kerja cache impor, ini menghasilkan dua eksekusi modul. Itu hanya Python, itu bukan sesuatu yang bisa dilakukan Jinja.

Jika Anda menyiapkan paket nyata dengan __init__.py dan menjalankannya sebagai modul, atau sebagai titik masuk, ini tidak akan terjadi. Atau letakkan kode utama di blok if __name__ == "__main__": .

Punya masalah yang sama di arch linux dengan python 3.4.2

Konstruktor PackageLoader menjalankan seluruh skrip untuk kedua kalinya, bukan 2 cetakan dalam skrip itu sendiri.
Gunakan FileSystemLoader sebagai gantinya dan berfungsi dengan baik:

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

Dokumentasinya agak menyesatkan di sana;)

我 也 是 这样 解决 的

Apakah halaman ini membantu?
0 / 5 - 0 peringkat