Traffine I/O

Bahasa Indonesia

2023-03-10

Penanganan Variabel yang Tidak Dinyatakan dalam Jinja

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:

python
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:

python
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:

python
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

https://www.programcreek.com/python/example/125597/jinja2.meta.find_undeclared_variables

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!