jinja2.meta.find_undeclared_variables
Dalam templating Jinja2, mengelola variabel merupakan aspek penting dalam menciptakan konten yang dinamis. Salah satu jenis variabel yang perlu dikelola dengan baik adalah variabel yang tidak dideklarasikan. Fungsi jinja2.meta.find_undeclared_variables
pada Jinja2 dirancang untuk membantu pengembang dalam mengidentifikasi variabel-variabel tersebut dalam sebuah template.
Fungsi find_undeclared_variables
memeriksa abstract syntax tree (AST) dari template Jinja2 dan mengembalikan kumpulan variabel yang tidak dideklarasikan. Variabel-variabel tersebut merupakan variabel yang digunakan dalam template tetapi tidak dideklarasikan dalam konteks.
Untuk menggunakan find_undeclared_variables
, pertama-tama Anda perlu mengimpor modul-modul yang diperlukan dan mem-parsing template Jinja2 Anda:
from jinja2 import Environment, FileSystemLoader, meta
env = Environment(loader=FileSystemLoader('templates'))
template_source = env.loader.get_source(env, 'my_template.html')
parsed_content = env.parse(template_source)
Sekarang, Anda dapat memanggil find_undeclared_variables
untuk mengidentifikasi variabel yang tidak dideklarasikan:
undeclared_variables = meta.find_undeclared_variables(parsed_content)
print(undeclared_variables)
Ini akan mengeluarkan kumpulan variabel yang tidak dideklarasikan dalam file 'my_template.html', seperti:
{'variable1', 'variable2', 'variable3'}
Contoh Kelas Penyetel Template
Berikut ini adalah contoh kelas penyetel template Jinja yang merender sebuah template sambil memeriksa variabel-variabel yang tidak dideklarasikan. Jika terdapat variabel-variabel yang tidak dideklarasikan, maka akan dilemparkan ValueError
:
from dataclasses import dataclass, field
from jinja2 import Environment, meta, Template
@dataclass
class Jinja2TemplateSetter:
query: str
query_params: dict
template: Template = field(init=False)
parsed_content = field(init=False)
def __post_init__(self):
self.template = Template(self.query)
self.parsed_content = self._parse_template()
self._check_undeclared_variables()
def _parse_template(self):
return self.template.environment.parse(self.template.source)
def _check_undeclared_variables(self):
undeclared_variables = meta.find_undeclared_variables(self.parsed_content)
missing_variables = undeclared_variables - set(self.query_params.keys())
if missing_variables:
raise ValueError(f"Undeclared variables in the query: {', '.join(missing_variables)}")
def render_template(self):
return self.template.render(self.query_params)
# Usage
if __name__ == "__main__":
query = "{{ greeting }} {{ name }}, welcome to Jinja2!"
query_params = {"greeting": "Hello", "name": "Alice"}
try:
template_setter = Jinja2TemplateSetter(query=query, query_params=query_params)
print(template_setter.render_template())
except ValueError as e:
print(str(e))
Kelas Jinja2TemplateSetter
menginisialisasi objek Template Jinja2 dan mem-parsing konten template dalam metode __post_init__
. Selanjutnya, kelas ini memeriksa variabel-variabel yang tidak dideklarasikan menggunakan metode _check_undeclared_variables
. Jika ada variabel-variabel yang tidak dideklarasikan, maka akan dilemparkan ValueError
. Metode render_template
digunakan untuk merender template menggunakan query_params
yang diberikan.
Referensi