Jinja Template์ด๋?
โข
Jinja ํ
ํ๋ฆฟ์ Python์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ
ํ๋ฆฟ ์์ง
โฆ
Django ํ
ํ๋ฆฟ ์์ง์์ ์๊ฐ์ ๋ฐ์ ๊ฐ๋ฐ
โฆ
Jinja๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ ์ ํ
์ด์
๋ก์ง๊ณผ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๋์ ์ผ๋ก HTML ์์ฑ
โฆ
Flask์์ ์ฌ์ฉ๋จ
โช
๋ณ์๋ ์ด์ค ์ค๊ดํธ {{ }}๋ก ๊ฐ์ธ์ ์ฌ์ฉ
<h1>์๋
ํ์ธ์, {{ name }}๋!</h1>
Python
๋ณต์ฌ
โช
์ ์ด๋ฌธ์ ํผ์ผํธ ๊ธฐํธ {% %}๋ก ํ์
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
Python
๋ณต์ฌ
์ฐธ๊ณ : Jinja Template + Airflow
โข
Airflow์์ Jinja ํ
ํ๋ฆฟ์ ์ฌ์ฉํ๋ฉด ์์
์ด๋ฆ, ํ๋ผ๋ฏธํฐ ๋๋ SQL ์ฟผ๋ฆฌ์ ๊ฐ์ ์์
๋งค๊ฐ๋ณ์๋ฅผ ํ
ํ๋ฆฟํ๋ ๋ฌธ์์ด๋ก ์ ์ ๊ฐ๋ฅ
โฆ
์ด๋ฅผ ํตํด ์ฌ์ฌ์ฉ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ์ํฌํ๋ก์ฐ ์์ฑ
โข
์ 2) ํ๋ผ๋ฏธํฐ ๋ฑ์ผ๋ก ๋์ด์จ ๋ณ์๋ฅผ ์ฝ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
# ๋์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ค๋ฅธ ํ
ํ๋ฆฟ ์์
์ ์
task2 = BashOperator(
task_id='task2',
bash_command='echo "์๋
ํ์ธ์, {{ params.name }}!"',
params={'name': 'John'}, # ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ๋งค๊ฐ๋ณ์
dag=dag
)
Python
๋ณต์ฌ
์ฐธ๊ณ : BashOperator ๋ ํผ๋ฐ์ค ๋ณด๊ธฐ
โข
bash_command (str) โ The command, set of commands or reference to a bash script (must be โ.shโ) to be executed. (templated)
โข
env (dict[str, str] | None) โ If env is not None, it must be a dict that defines the environment variables for the new process; these are used instead of inheriting the current process environment, which is the default behavior. (templated)
โข
append_env (bool) โ If False(default) uses the environment variables passed in env params and does not inherit the current process environment. If True, inherits the environment variables from current passes and then environment variable passed by the user will either update the existing inherited environment variables or the new variables gets appended to it
โข
output_encoding (str) โ Output encoding of bash command
โข
skip_on_exit_code (int | Container[int] | None) โ If task exits with this exit code, leave the task in skipped state (default: 99). If set to None, any non-zero exit code will be treated as a failure.
โข
cwd (str | None) โ Working directory to execute the command in. If None (default), the command is run in a temporary directory
์ฐธ๊ณ : Airflow์์ ์ฌ์ฉ ๊ฐ๋ฅํ Jinja ๋ณ์๋ค ๋ช๊ฐ ์ดํด๋ณด๊ธฐ
โข
{{ ds }}
โฆ
ํ์ฌ ์คํ ์ค์ธ DAG ์ธ์คํด์ค์ ์คํ ๋ ์ง (๋ ์ง ๋ฌธ์์ด ํ์: "YYYY-MM-DD").
โข
{{ ds_nodash }}
โฆ
ํ์ฌ ์คํ ์ค์ธ DAG ์ธ์คํด์ค์ ์คํ ๋ ์ง (๋ ์ง ๋ฌธ์์ด ํ์: "YYYYMMDD").
โข
{{ ts }}
โฆ
ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ์ ์์ ์๊ฐ (์๊ฐ ๋ฐ ๋ ์ง ๋ฌธ์์ด ํ์: "YYYY-MM-DDTHH:MM:SS")
โข
{{ dag }}
โฆ
ํ์ฌ ์คํ ์ค์ธ DAG ์ธ์คํด์ค์ DAG ๊ฐ์ฒด.
โข
{{ task }}
โฆ
ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ ๊ฐ์ฒด.
โข
{{ dag_run }}
โฆ
ํ์ฌ ์คํ ์ค์ธ DAG ์ธ์คํด์ค์ DAGRun ๊ฐ์ฒด.
โข
{{ var.value }}
โฆ
{{ var.value.get('my.var', 'fallback') }}
โฆ
Airflow ๋ณ์์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
โฆ
var์ Airflow์์ ์ ์๋ ๋ณ์์ ์ด๋ฆ์ ๋ํ๋ด๋ฉฐ, value๋ ํด๋น ๋ณ์์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
โฆ
์๋ฅผ ๋ค์ด, {{ var.value.get('my.var', 'fallback') }}๋ my.var๋ผ๋ ๋ณ์์ ๊ฐ์ ๊ฐ์ ธ์ค๋ฉฐ, ๊ฐ์ด ์๋ ๊ฒฝ์ฐ 'fallback'์ ๋ฐํํฉ๋๋ค.
โข
{{ var.json }}
โฆ
{{ var.json.my_dict_var.key1 }}
โฆ
Airflow ๋ณ์์ JSON ํ์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
โฆ
var.json์ JSON ํ์์ ๋ณ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ฉฐ, ์ด๋ฅผ ํตํด ๋ด๋ถ ์์ฑ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
โฆ
์๋ฅผ ๋ค์ด, {{ var.json.my_dict_var.key1 }}๋ my_dict_var๋ผ๋ ๋ณ์์ key1 ์์ฑ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
โข
{{ conn }}
โฆ
{{ conn.my_conn_id.login }}, {{ conn.my_conn_id.password }}
โฆ
Airflow ์ฐ๊ฒฐ (Connection)์ ์์ฑ์ ์ ๊ทผํฉ๋๋ค.
โฆ
conn์ Airflow์์ ์ ์๋ ์ฐ๊ฒฐ์ ์ด๋ฆ์ ๋ํ๋ด๋ฉฐ, my_conn_id๋ผ๋ ์ฐ๊ฒฐ์ login ๋ฐ password ์์ฑ ๊ฐ์ ์ ๊ทผํ๋ ์์๋ ์๋์ ๊ฐ์ต๋๋ค
โฆ
{{ conn.my_conn_id.login }}, {{ conn.my_conn_id.password }}.
์ฐธ๊ณ : Airflow์์ Jinja ๋ณ์๋ฅผ ์ฌ์ฉํ ์์ ์ฝ๋ ์ดํด๋ณด๊ธฐ
โข
์ฝ๋
from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime
# DAG ์ ์
dag = DAG(
'Learn_Jinja',
schedule='0 0 * * *', # ๋งค์ผ ์คํ
start_date=datetime(2023, 6, 1),
catchup=False
)
# BashOperator๋ฅผ ์ฌ์ฉํ์ฌ ํ
ํ๋ฆฟ ์์
์ ์
task1 = BashOperator(
task_id='task1',
bash_command='echo "{{ ds }}"',
dag=dag
)
# ๋์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ค๋ฅธ ํ
ํ๋ฆฟ ์์
์ ์
task2 = BashOperator(
task_id='task2',
bash_command='echo "์๋
ํ์ธ์, {{ params.name }}!"',
params={'name': 'John'}, # ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ๋งค๊ฐ๋ณ์
dag=dag
)
task3 = BashOperator(
task_id='task3',
bash_command="""echo "{{ dag }}, {{ task }}, {{ var.value.get('csv_url') }}" """,
dag=dag
)
task1 >> task2 >> task3
Python
๋ณต์ฌ