Jinja: template yang diimpor terlalu lama di-cache

Dibuat pada 16 Jul 2013  ·  4Komentar  ·  Sumber: pallets/jinja

Saya memiliki template bernama main.html. Ini {% mengimpor %} modul yang disebut module_a (tanpa konteks). module_a {% impor %} module_b dengan cara yang sama.

Ketika saya mengubah module_a, pemuat template mengenali ini dan memuatnya kembali.

Ketika saya mengubah module_b, pemuat template tidak mengenalinya. Saya harus memulai kembali prosesnya.

Saya percaya ini karena fakta bahwa kode yang dihasilkan untuk module_a melakukan impor dalam fungsi root()-nya. get_template melihat bahwa module_a up to date, jadi tidak memuat ulang, jadi tidak menjalankan kembali fungsi root()-nya.

Saya tidak yakin bagaimana mengatasi ini. Jelas memanggil root() pada setiap panggilan ke get_template buruk. Solusi paling lengkap adalah dengan melacak dependensi masing-masing template, tapi itu banyak pekerjaan.

Komentar yang paling membantu

Masalahnya adalah impor di-cache tetapi tidak dilacak. Saya tidak yakin apa cara terbaik untuk menangani ini.

Semua 4 komentar

Kami juga mengalami hal ini. (Saya hampir tidak menemukan bug ini karena Anda tidak menggunakan istilah auto_reload -- ini hanya relevan jika auto_reload=True ).

Sepertinya ini akan cukup sulit untuk diperbaiki; idealnya Anda ingin metode uptodate dikembalikan dari get_source untuk memeriksa tidak hanya file sumber itu sendiri, tetapi juga file sumber apa pun yang diimpor, diperluas, atau disertakan. Tetapi pada saat uptodate ditentukan, yang Anda miliki hanyalah sumber mentah yang belum diurai, sehingga informasi itu tidak tersedia.

Ini mungkin dapat diterapkan pada tingkat yang lebih tinggi (misalnya dalam Template.is_up_to_date ) tetapi sepertinya itu juga memerlukan operasi yang signifikan untuk mendapatkan kembali info ketergantungan dari kompiler.

Saya baru saja mengalami ini juga. Ini cukup mengganggu dalam pengembangan karena itu berarti saya harus mengatur cache_size ke 0, dan kemudian semuanya menjadi sangat lambat (seperti yang diharapkan).

Saya akan mencoba menggali internal untuk melihat apakah saya menemukan sesuatu. Sementara itu, jika seseorang dengan lebih banyak pengalaman dapat menyarankan dengan solusi atau bahkan beberapa arahan, itu akan sangat bagus!

Masalahnya adalah impor di-cache tetapi tidak dilacak. Saya tidak yakin apa cara terbaik untuk menangani ini.

Oke, jadi masalahnya di sini bukan dengan caching template tetapi caching variabel yang diteruskan ke makro yang diimpor.
(setidaknya dalam kasus saya)

Solusi saya adalah menggunakan metode yang mengembalikan nilai konteks saya yang diperbarui untuk dirender.

Dalam skenario saya, saya membuat makro untuk pagination. Makro membutuhkan objek permintaan.

pendekatan awal dalam makro
{% set pagenum, limit = request.args.pg , request.args.limit %}
Ini akan bekerja pada awalnya, tetapi pada permintaan berikutnya nilai konteks makro selamanya di-cache kecuali server reboot

pendekatan kerja dalam makro
{% set pagenum, limit = request.get_params() %}
Ini sekarang akan mengembalikan parameter permintaan saya yang diperbarui pada setiap panggilan tanpa mengorbankan caching makro saya.

Saya juga memperhatikan bahwa caching makro memiliki ~2,5 x lebih cepat dalam waktu respons saya.
Tanpa caching ~= 450ms
Dengan caching ~= 150ms

Apakah halaman ini membantu?
0 / 5 - 0 peringkat