Skip to content

jinja#

  • Jinja2 公式サイト には以下のように説明されています。

    Jinjaは、高速で表現力豊かで拡張可能なテンプレートエンジンです。テンプレート内の特別なプレースホルダーを使用すると、Python構文に似たコードを記述できます。次に、テンプレートにデータが渡され、最終的なドキュメントがレンダリングされます。

  • 要するに テンプレートファイル内の {{ 変数 }} の箇所を変換するテンプレートエンジンのことです。
  • テキストベースのファイルであれば、何でもレンダリングする事ができます。
  • 必ずしもテンプレートの拡張子は.j2である必要はないですが、.j2としておいた方が管理しやすいです。

基本的な使い方1#

sample_jinja.py
from jinja2 import Environment, FileSystemLoader
from os import path

data = {"name":"Mike"}

env = Environment(loader=FileSystemLoader(path.dirname(__file__),trim_blocks=True))
template = env.get_template("sample.j2")

result = template.render(data)

print(result)
sample.j2
Hi {{ name }} !

基本的な使い方2#

NUM で数を指定してコンフィグを作成する Python 側で定義した変数は {% %}文の中では {{}}で囲まずにそのまま記述すること

Config 作成
from jinja2 import Environment, FileSystemLoader
from os import path

data = {"NUM":10}

env = Environment(loader=FileSystemLoader(path.dirname(__file__)),trim_blocks=True)
template = env.get_template("template/sample.j2")

result = template.render(data)


with open('config/test.txt', "w", encoding='utf-8') as f:
    f.write(result)
sample.j2
{% for x in range(NUM) %}
 interface Te0/0/0/0.{{x}}
  encapsuration dot1q {{x}}
{% endfor %}

空白の扱い#

  • {%- xxx -%}のように -を付与すると空白を削除してレンダリングする。
  • または trim_blocks=True,lstrip_blocks=Trueにて指定

特殊文字のエスケープ#

  • {%などを含んだ文字列等がある場合、エスケープしたい箇所をrawブロックで囲む
  • '{{' のようにクォーテーション付きで文字列として記述すれば括弧としてレンダリングされる
{% raw %}
...
% endraw %}

コメント#

{# コメント内容 #}の形式で記述

変数定義#

  • str型はシングルクォーテーションもしくはダブルクォーテーションで囲むこと
  • bool型・int型などはそのままでOK
from jinja2 import Template


config = str(
    "{% set description = 'TEST' %}"
    'interface GigabitEthernet0/0/0/0\n'
    ' description {{ description }}\n'
)

template: Template = Template(source=config)
rendered_cfg = template.render()
print(rendered_cfg)

演算子#

"{% set 変数名 = 式 %}" にて演算子を記述する事が可能

  • 加算: +
  • 減算: -
  • 除算: /
  • 除算(切り捨て): //
  • 剰余: %
  • 乗算: *
  • 累乗: **

変数のインクリメント#

{% set ns = namespace(cnt=1) %}
{% for i in range(10) %}
{{ ns.cnt }}
{% set ns.cnt = ns.cnt + 1 %}
{% endfor %}

条件文#

"{% if 条件式 %}"

"{% endif %}"

以下の条件演算子が使用可能

  • 等値: ==
  • 非等値: !=
  • 超過: >
  • 以上: >=
  • 未満: <
  • 以下: <=
  • AND条件(複数の条件を全て満たした場合にTrue): and
  • OR条件(いずれかの条件を満たした場合にTrue): or
  • 否定: not

Tip

None を使用する場合は noneと記述すること 例:"{% if var is none %}"

Pythonビルトインのメソッドを使う#

{{ 文字列.lower() }}のようにpython ビルトインメソッドの記述が可能

ビルトインフィルター#

Jinja2 - List of Builtin Filtersを参照

カスタムフィルター#

フィルターをカスタマイズすることも可能

def add_int(target, number):
    return target += number 

env.filters['add_int'] = add_int

csvとの組み合わせ#

以下プログラムはcsvファイルでパラメータを管理し、jinja のテンプレートを基に書き込みを行う

  • params.csv: パラメーターが記載されたファイル
  • template.j2: 書き込む内容が記述されたテンプレートファイル
  • sample.py: サンプルプログラム
sample.py
import csv
from jinja2 import Environment, FileSystemLoader
from os import path

env = Environment(loader=FileSystemLoader(path.dirname(__file__),trim_blocks=True))
template = env.get_template("template.j2")

with open("params.csv", "r", newline="") as f:
    csv_file = csv.DictReader(f)
    for data in csv_file:
      result = template.render(data)

Other#