Saya menggunakan jinja2, dan saya ingin memanggil fungsi python sebagai penolong, menggunakan sintaksis yang sama seperti jika saya memanggil makro. jinja2 tampaknya berniat mencegah saya membuat panggilan fungsi, dan bersikeras saya ulangi diri saya dengan menyalin fungsi ke dalam templat sebagai makro.
Apakah ada cara mudah untuk melakukan ini? Dan, apakah ada cara untuk mengimpor seluruh rangkaian fungsi python dan membuatnya dapat diakses dari jinja2, tanpa melalui banyak omong kosong (seperti menulis ekstensi)?
from jinja2 import Template ##newline## def clever_function(): ##newline## return "Hello" ##newline## template = Template("{{ clever_function() }}") ##newline## print(template.render(clever_function=clever_function))
Catatan: Ini khusus untuk Labu!
Saya tahu posting ini cukup lama, tetapi ada metode yang lebih baik untuk melakukan ini di versi Flask yang lebih baru menggunakan pemroses konteks.
Variabel dapat dengan mudah dibuat:
Di atas dapat digunakan dalam template Jinja2 dengan Labu seperti:
(Output mana
This is an example
)Serta fungsi lengkap penuh:
Di atas ketika digunakan seperti:
(Yang menampilkan harga input dengan simbol mata uang)
Atau, Anda dapat menggunakan filter jinja , yang dimasukkan ke dalam Flask. Misalnya menggunakan dekorator:
Atau, tanpa dekorator, dan mendaftarkan fungsi secara manual:
Filter yang diterapkan dengan dua metode di atas dapat digunakan seperti ini:
sumber
__init__.py
dengan asumsi Anda menyatakan diflask.Flask(__name__)
sana.Saya pikir jinja sengaja membuatnya sulit untuk menjalankan python 'sewenang-wenang' dalam sebuah template. Ia mencoba untuk menegakkan pendapat bahwa logika yang kurang dalam template adalah hal yang baik.
Anda dapat memanipulasi namespace global dalam sebuah
Environment
instance untuk menambahkan referensi ke fungsi Anda. Itu harus dilakukan sebelum Anda memuat template apa pun. Sebagai contoh:sumber
import utils.helpers env.globals['helpers'] = utils.helpers
{{ clever_function('a', 'b') }}
Anda juga dapat memberikan fungsi di bidang sesuai jawaban Matroskin
Akan menghasilkan:
Bekerja dengan Jinja2 versi 2.7.3
Dan jika Anda ingin seorang dekorator memudahkan menentukan fungsi pada
template.globals
memeriksa jawaban Bruno Bronoskysumber
Saya suka jawaban @ AJP . Saya menggunakannya kata demi kata sampai akhirnya memiliki banyak fungsi. Kemudian saya beralih ke dekorator fungsi Python .
Fungsi hal yang baik miliki
__name__
!sumber
Tidak pernah melihat cara sederhana di dokumen resmi atau di stack overflow, tetapi saya kagum ketika menemukan ini:
sumber
Gunakan lambda untuk menghubungkan templat ke kode utama Anda
Kemudian Anda dapat memanggil fungsi di dalam templat dengan mulus
sumber
Untuk memanggil fungsi python dari Jinja2, Anda dapat menggunakan filter khusus yang berfungsi sama seperti global: http://jinja.pocoo.org/docs/dev/api/#writing-filters
Ini cukup sederhana dan bermanfaat. Dalam file myTemplate.txt, saya menulis:
Dan dalam skrip python:
sumber
apakah ada cara untuk mengimpor seluruh rangkaian fungsi python dan membuatnya dapat diakses dari jinja2?
Ya ada, Selain jawaban lain di atas, ini berfungsi untuk saya.
Buat kelas dan isi dengan metode terkait mis
Kemudian buat instance kelas Anda di fungsi tampilan Anda dan meneruskan objek yang dihasilkan ke template Anda sebagai parameter untuk fungsi render_template
Sekarang di templat Anda, Anda dapat memanggil metode kelas di jinja seperti itu
sumber
Untuk mengimpor semua fungsi bawaan Anda dapat menggunakan:
Tambahkan
.__dict__
setelah__builtins__
jika ini tidak berhasil.Berdasarkan jawaban John32323 .
sumber
Jika Anda melakukannya dengan Django, Anda bisa meneruskan fungsi dengan konteks:
Sekarang Anda akan dapat menggunakan
str
fungsi dalam template jinja2sumber
Ada keputusan yang jauh lebih sederhana.
Lalu, di test.html :
sumber