Flask Jinja2 ν νλ¦Ώ μμμ λν ν¬κ΄μ μΈ κ°μ΄λ. κΈ°λ³Έ ν νλ¦Ώ, λΈλ‘ μ μ, ν¨μ¨μ μΈ μΉ κ°λ°μ μν μ€μ μμλ₯Ό λ€λ£Ήλλ€.
Flask ν νλ¦Ώ μμ: Jinja2 ν νλ¦Ώ ꡬμ±μ λ§μ€ν°νκΈ°
μΉ κ°λ°μμ μ¬λ¬ νμ΄μ§μ κ±Έμ³ μΌκ΄λ λͺ¨μκ³Ό λλμ μ μ§νλ κ²μ λ§€μ° μ€μν©λλ€. μΈκΈ° μλ Python μΉ νλ μμν¬μΈ Flaskλ μ μ°νκ³ λΉ λ₯Έ ν νλ¦Ώ μμ§μΈ Jinja2μ κ°λ ₯ν κΈ°λ₯μ νμ©νμ¬ ν νλ¦Ώ μμμ ν΅ν΄ μ΄λ₯Ό μ©μ΄νκ² ν©λλ€. ν νλ¦Ώ μμμ μ¬μ©νλ©΄ κ³΅ν΅ μμλ₯Ό ν¬ν¨νλ κΈ°λ³Έ ν νλ¦Ώμ μ μν λ€μ λ€λ₯Έ ν νλ¦Ώμμ μ΄λ₯Ό νμ₯νμ¬ μ½λ μ¬μ¬μ©μ μ΄μ§νκ³ μ μ§ κ΄λ¦¬λ₯Ό λ¨μνν μ μμ΅λλ€. μ΄ κΈμ Flask Jinja2 ν νλ¦Ώ μμμ λν ν¬κ΄μ μΈ κ°μ΄λλ₯Ό μ 곡νλ©°, κ·Έ μμΉ, ꡬν λ° λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£Ήλλ€.
ν νλ¦Ώ μμμ΄λ 무μμΈκ°μ?
ν νλ¦Ώ μμμ μΉμ¬μ΄νΈμ ν΅μ¬ ꡬ쑰μ λ μ΄μμμ ν¬ν¨νλ κΈ°λ³Έ ν νλ¦Ώμ λ§λ€ μ μκ² ν΄μ£Όλ λμμΈ ν¨ν΄μ λλ€. νμ ν νλ¦Ώμ μ΄ κΈ°λ³Έ ν νλ¦Ώμ μμλ°μ νΉμ μΉμ λλ 'λΈλ‘'μ μ¬μ μνμ¬ μ½ν μΈ λ₯Ό μ¬μ©μ μ μν μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ μ½λ μ€λ³΅μ μ΅μννκ³ μΌκ΄μ±μ 보μ₯νλ©° μΉ μ ν리μΌμ΄μ μ 체μ μ λ°μ΄νΈλ₯Ό λ¨μνν©λλ€.
μ§μ μ²μ¬μ§κ³Ό κ°λ€κ³ μκ°ν΄λ³΄μΈμ. κΈ°λ³Έ ν νλ¦Ώμ κΈ°μ΄, λ²½, μ§λΆμ ν¬ν¨ν μ 체μ μΈ λμμΈμ λλ€. κ° κ°λ³ λ°©(νμ ν νλ¦Ώ)μ κΈ°λ³Έ ꡬ쑰λ₯Ό μμλ°μ§λ§, λ€λ₯Έ λ°λ₯μ¬, νμΈνΈ, κ°κ΅¬λ‘ μ¬μ©μ μ μλ μ μμ΅λλ€.
ν νλ¦Ώ μμμ μ₯μ
- μ½λ μ¬μ¬μ©μ±: κ³΅ν΅ μμλ₯Ό κΈ°λ³Έ ν νλ¦Ώμ μ μνκ³ μ¬λ¬ νμ΄μ§μμ μ¬μ¬μ©νμ¬ λΆνμν μ½λλ₯Ό νΌν μ μμ΅λλ€.
- μΌκ΄μ±: ν€λ, νΈν°, νμ λ©λ΄μ κ°μ 곡μ μμμ λν λ¨μΌ μ 보μμ μ μ§ν¨μΌλ‘μ¨ μΉμ¬μ΄νΈ μ 체μμ μΌκ΄λ λͺ¨μκ³Ό λλμ 보μ₯ν©λλ€.
- μ μ§ κ΄λ¦¬μ±: κΈ°λ³Έ ν νλ¦Ώμ λ³κ²½ν¨μΌλ‘μ¨ μ λ°μ΄νΈ λ° μμ μμ μ λ¨μνν μ μμΌλ©°, μ΄λ λͺ¨λ νμ ν νλ¦Ώμ μλμΌλ‘ μ νλ©λλ€.
- 체κ³ν: ν νλ¦Ώμ λ Όλ¦¬μ μ΄κ³ κ³μΈ΅μ μΈ λ°©μμΌλ‘ ꡬμ±νμ¬ μ½λλ² μ΄μ€λ₯Ό μ΄ν΄νκ³ κ΄λ¦¬νκΈ° μ½κ² λ§λλλ€.
- κ°λ° μκ° λ¨μΆ: μ νμ΄μ§λ₯Ό μ²μλΆν° λ§λλ λμ κΈ°λ³Έ ν νλ¦Ώμ μμμ μΌλ‘ νμ©νμ¬ μκ°κ³Ό λ Έλ ₯μ μ μ½ν μ μμ΅λλ€.
μ£Όμ κ°λ μ΄ν΄νκΈ°
1. κΈ°λ³Έ ν νλ¦Ώ
κΈ°λ³Έ ν νλ¦Ώμ ν νλ¦Ώ μμ ꡬ쑰μ κΈ°λ°μ λλ€. μΉμ¬μ΄νΈμ λͺ¨λ νμ΄μ§ λλ λλΆλΆμ νμ΄μ§μμ 곡μ λ κ³΅ν΅ μμλ₯Ό ν¬ν¨ν©λλ€. μ¬κΈ°μλ μΌλ°μ μΌλ‘ HTML ꡬ쑰, CSS μ€νμΌμνΈ, JavaScript νμΌ, ν€λ, νΈν° λ° νμ λ©λ΄κ° ν¬ν¨λ©λλ€.
κΈ°λ³Έ ν
νλ¦Ώ(base.html
)μ μ:
{% block title %}My Website{% endblock %}
My Website
{% block content %}{% endblock %}
μ΄ μμμμλ ν€λ, νμ λ©λ΄, μ£Όμ μ½ν
μΈ μμ λ° νΈν°λ₯Ό ν¬ν¨νλ κΈ°λ³Έ HTML ꡬ쑰λ₯Ό μ μν©λλ€. νμ ν
νλ¦Ώμμ μ¬μ μν μ μλ μΉμ
μ μ μνλ {% block %}
νκ·Έμ μ£Όλͺ©νμΈμ.
2. λΈλ‘ μ μ
λΈλ‘μ κΈ°λ³Έ ν
νλ¦Ώ λ΄μ νλ μ΄μ€νλλ‘, νμ ν
νλ¦Ώμ μν΄ κ΅μ²΄λκ±°λ μμ λ μ μμ΅λλ€. μ΄λ€μ {% block %}
λ° {% endblock %}
νκ·Έλ₯Ό μ¬μ©νμ¬ μ μλ©λλ€. λΈλ‘μ μ¬μ©νλ©΄ κΈ°λ³Έ ν
νλ¦Ώμ λ€λ₯Έ λΆλΆμ νΉμ μ½ν
μΈ λ₯Ό μ½μ
ν μ μμ΅λλ€.
μ base.html
μμμμ λ κ°μ λΈλ‘μ μ μνμ΅λλ€:
title
: μ΄ λΈλ‘μ HTML λ¬Έμμ μ λͺ©μ μ μν©λλ€.content
: μ΄ λΈλ‘μ νμ΄μ§μ μ£Όμ μ½ν μΈ μμμ μ μν©λλ€.
3. νμ ν νλ¦Ώ
νμ ν
νλ¦Ώμ κΈ°λ³Έ ν
νλ¦Ώμ μμλ°κ³ κΈ°λ³Έ ν
νλ¦Ώμ μ μλ λΈλ‘μ μ¬μ μν μ μμ΅λλ€. κΈ°λ³Έ ν
νλ¦Ώμ μμνλ €λ©΄ νμ ν
νλ¦Ώ μμ λΆλΆμ {% extends %}
νκ·Έλ₯Ό μ¬μ©νμΈμ.
base.html
ν
νλ¦Ώμ νμ₯νλ νμ ν
νλ¦Ώ(index.html
)μ μ:
{% extends 'base.html' %}
{% block title %}Home - My Website{% endblock %}
{% block content %}
Welcome to the Home Page!
This is the content of the home page.
{% endblock %}
μ΄ μμμμλ base.html
ν
νλ¦Ώμ νμ₯νκ³ title
λ° content
λΈλ‘μ μ¬μ μν©λλ€. title
λΈλ‘μ "Home - My Website"λ‘ μ€μ λκ³ , content
λΈλ‘μ ν νμ΄μ§μ νΉμ ν μ½ν
μΈ λ‘ λ체λ©λλ€.
4. `super()` ν¨μ
super()
ν¨μλ₯Ό μ¬μ©νλ©΄ νμ ν
νλ¦Ώ λ΄μμ κΈ°λ³Έ ν
νλ¦Ώμ μ μλ λΈλ‘μ μ½ν
μΈ μ μ κ·Όν μ μμ΅λλ€. μ΄λ λΈλ‘μ μ½ν
μΈ λ₯Ό μμ ν κ΅μ²΄νμ§ μκ³ μΆκ°νκ±°λ μμ νλ €λ κ²½μ°μ μ μ©ν©λλ€.
content
λΈλ‘μ μ½ν
μΈ λ₯Ό μΆκ°νκΈ° μν΄ super()
λ₯Ό μ¬μ©νλ μ:
{% extends 'base.html' %}
{% block content %}
{{ super() }}
This is additional content added to the base template's content block.
{% endblock %}
μ΄ μμμμ super()
ν¨μλ base.html
ν
νλ¦Ώμμ content
λΈλ‘μ μλ³Έ μ½ν
μΈ λ₯Ό μ½μ
ν λ€μ, νμ ν
νλ¦Ώμ΄ κ·Έ μλμ μ체 μ½ν
μΈ λ₯Ό μΆκ°ν©λλ€.
Flaskμμ ν νλ¦Ώ μμ ꡬννκΈ°
Flaskμμ ν νλ¦Ώ μμμ μ¬μ©νλ €λ©΄ ν νλ¦Ώμ λ Όλ¦¬μ μΈ λλ ν 리 κ΅¬μ‘°λ‘ κ΅¬μ±νκ³ Flaskκ° ν νλ¦Ώμ μ°Ύλλ‘ κ΅¬μ±ν΄μΌ ν©λλ€.
1. λλ ν 리 ꡬ쑰
Flask ν νλ¦Ώμ λν μΌλ°μ μΈ λλ ν 리 ꡬ쑰λ λ€μκ³Ό κ°μ΅λλ€:
my_project/
app.py
templates/
base.html
index.html
about.html
contact.html
static/
style.css
script.js
μ΄ κ΅¬μ‘°μμ templates
λλ ν 리μλ κΈ°λ³Έ ν
νλ¦Ώκ³Ό νμ ν
νλ¦Ώμ ν¬ν¨ν λͺ¨λ HTML ν
νλ¦Ώμ΄ λ€μ΄ μμ΅λλ€. static
λλ ν 리μλ CSS μ€νμΌμνΈ λ° JavaScript νμΌκ³Ό κ°μ μ μ νμΌμ΄ ν¬ν¨λ©λλ€.
2. Flask ꡬμ±
κΈ°λ³Έμ μΌλ‘ Flaskλ μ ν리μΌμ΄μ
κ³Ό κ°μ λλ ν 리μ μλ templates
λΌλ μ΄λ¦μ λλ ν 리μμ ν
νλ¦Ώμ μ°Ύμ΅λλ€. Flask μ± κ°μ²΄μ template_folder
μμ±μ μ€μ νμ¬ μ΄λ₯Ό μ¬μ©μ μ§μ ν μ μμ΅λλ€.
μ¬μ©μ μ§μ ν νλ¦Ώ ν΄λλ₯Ό μ¬μ©νλλ‘ Flaskλ₯Ό ꡬμ±νλ μ:
from flask import Flask, render_template
app = Flask(__name__, template_folder='my_templates')
@app.route('/')
def index():
return render_template('index.html')
3. ν νλ¦Ώ λ λλ§
Flaskμμ ν
νλ¦Ώμ λ λλ§νλ €λ©΄ render_template()
ν¨μλ₯Ό μ¬μ©νμΈμ. μ΄ ν¨μλ ν
νλ¦Ώ νμΌ μ΄λ¦μ μΈμλ‘ λ°μ λ λλ§λ HTML λ¬Έμμ΄μ λ°νν©λλ€.
index.html
ν
νλ¦Ώμ λ λλ§νλ μ:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
νμ ν νλ¦Ώμ λ λλ§ν λ Flaskλ μλμΌλ‘ κΈ°λ³Έ ν νλ¦Ώμ ν¬ν¨νκ³ νμ ν νλ¦Ώμ μ μλ λΈλ‘ μ¬μ μλ₯Ό μ μ©ν©λλ€.
μ€μ μμ
μμ 1: κ°λ¨ν λΈλ‘κ·Έ
κΈ°λ³Έ ν νλ¦Ώκ³Ό λΈλ‘κ·Έ κ²μλ¬Όλ³ κ°λ³ ν νλ¦Ώμ μ¬μ©νμ¬ κ°λ¨ν λΈλ‘κ·Έλ₯Ό λ§λ€μ΄ λ΄ μλ€.
base.html:
{% block title %}My Blog{% endblock %}
My Blog
{% block content %}{% endblock %}
post.html:
{% extends 'base.html' %}
{% block title %}{{ post.title }} - My Blog{% endblock %}
{% block content %}
{{ post.title }}
Published on: {{ post.date }}
{{ post.content }}
{% endblock %}
μ΄ μμμμ post.html
ν
νλ¦Ώμ base.html
ν
νλ¦Ώμ νμ₯νκ³ λΈλ‘κ·Έ κ²μλ¬Όμ μ λͺ©, λ μ§, μ½ν
μΈ λ‘ title
λ° content
λΈλ‘μ μ¬μ μν©λλ€. post
λ³μλ Flask κ²½λ‘μμ ν
νλ¦ΏμΌλ‘ μ λ¬λ©λλ€.
app.py:
from flask import Flask, render_template
app = Flask(__name__)
posts = [
{
'title': 'First Blog Post',
'date': '2023-10-27',
'content': 'This is the content of the first blog post.'
},
{
'title': 'Second Blog Post',
'date': '2023-10-28',
'content': 'This is the content of the second blog post.'
}
]
@app.route('/')
def index():
return render_template('index.html', posts=posts)
@app.route('/post/')
def post(post_id):
post = posts[post_id]
return render_template('post.html', post=post)
μμ 2: λ€κ΅μ΄ μΉμ¬μ΄νΈ
μ¬λ¬ μΈμ΄λ₯Ό μ§μνλ μΉμ¬μ΄νΈλ₯Ό ꡬμΆνλ€κ³ μμν΄ λ³΄μΈμ. ν νλ¦Ώ μμμ κ° νμ΄μ§μ λ€λ₯Έ ν μ€νΈ μμλ₯Ό κ΄λ¦¬νλ λ° λμμ΄ λ μ μμ΅λλ€. λ²μλ ν μ€νΈλ₯Ό μν νλ μ΄μ€νλκ° μλ κΈ°λ³Έ ν νλ¦Ώμ λ§λ λ€μ, κ° μΈμ΄λ³λ‘ νμ ν νλ¦Ώμ λ§λ€ μ μμ΅λλ€. μλ₯Ό λ€μ΄, κΈ°λ³Έ ν νλ¦Ώμ΄ μκ³ μμ΄μ νλμ€μ΄λ₯Ό μ§μνλ€κ³ κ°μ ν΄ λ΄ μλ€.
base.html:
{% block title %}{% endblock %}
{% block content %}{% endblock %}
index_en.html (μμ΄ λ²μ ):
{% extends "base.html" %}
{% block title %}Welcome to My Website{% endblock %}
{% block home_link %}Home{% endblock %}
{% block about_link %}About{% endblock %}
{% block content %}
Welcome!
This is the English version of the homepage.
{% endblock %}
index_fr.html (νλμ€μ΄ λ²μ ):
{% extends "base.html" %}
{% block title %}Bienvenue sur mon site web{% endblock %}
{% block home_link %}Accueil{% endblock %}
{% block about_link %}Γ propos{% endblock %}
{% block content %}
Bienvenue !
Ceci est la version franΓ§aise de la page d'accueil.
{% endblock %}
μ΄ λ¨μνλ μμμμ κ° μΈμ΄ λ²μ μ κΈ°λ³Έ ν νλ¦Ώμ νμ₯νκ³ μ λͺ©, νμ λ§ν¬ λ° μ£Όμ μ½ν μΈ μ λν λ²μλ ν μ€νΈλ₯Ό μ 곡ν©λλ€. μ΄ μ κ·Ό λ°©μμ μΉμ¬μ΄νΈμ λ€λ₯Έ μΈμ΄ λ²μ μ λ μ½κ² κ΄λ¦¬ν μ μκ² ν΄μ€λλ€.
λͺ¨λ² μ¬λ‘
- κΈ°λ³Έ ν νλ¦Ώμ λ¨μνκ² μ μ§: κΈ°λ³Έ ν νλ¦Ώμ λͺ¨λ νμ΄μ§μμ 곡μ λλ νμ μμλ§ ν¬ν¨ν΄μΌ ν©λλ€.
- μ€λͺ μ μΈ λΈλ‘ μ΄λ¦ μ¬μ©: λͺ©μ μ λͺ ννκ² λνλ΄λ λΈλ‘ μ΄λ¦μ μ ννμΈμ.
- ν νλ¦Ώμ λ Όλ¦¬μ μΌλ‘ ꡬμ±: κ΄λ ¨ ν νλ¦Ώμ λλ ν λ¦¬λ‘ λ¬Άμ΄ κ΄λ¦¬νμΈμ.
- κΉκ² μ€μ²©λ μμ νΌνκΈ°: 볡μ‘μ±μ νΌνκΈ° μν΄ μμ κ³μΈ΅ ꡬ쑰μ κΉμ΄λ₯Ό μ ννμΈμ.
- `super()` ν¨μλ₯Ό μ μ€νκ² μ¬μ©: κΈ°λ³Έ ν
νλ¦Ώμ λΈλ‘ μ½ν
μΈ λ₯Ό μΆκ°νκ±°λ μμ ν΄μΌ ν λλ§
super()
ν¨μλ₯Ό μ¬μ©νμΈμ. - ν νλ¦Ώ κ΅¬μ± μμ μ¬μ© κ³ λ €: λ 볡μ‘ν μΉμ¬μ΄νΈμ κ²½μ°, ν νλ¦Ώμ λ μκ³ μ¬μ¬μ© κ°λ₯ν κ΅¬μ± μμλ‘ λΆν΄νλ κ²μ κ³ λ €νμΈμ. μ΄λ Jinja2μ include λλ macroλ₯Ό ν΅ν΄ λ¬μ±λ μ μμ§λ§, μ΄λ μ’μ μμ μ λ΅μ 보μν΄μΌ νλ©° λ체ν΄μλ μ λ©λλ€.
κ³ κΈ κΈ°μ
1. μ‘°κ±΄λΆ λΈλ‘ μ¬μ μ
ν νλ¦Ώ λ΄μμ 쑰건문μ μ¬μ©νμ¬ νΉμ 쑰건μ λ°λΌ λΈλ‘μ 쑰건λΆλ‘ μ¬μ μν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μ μν , νκ²½ μ€μ λλ κΈ°ν μμΈμ λ°λΌ νμ΄μ§ μ½ν μΈ λ₯Ό μ¬μ©μ μ§μ ν μ μμ΅λλ€.
{% extends 'base.html' %}
{% block content %}
{% if user.is_authenticated %}
νμν©λλ€, {{ user.username }}λ!
μ΄κ²μ μΈμ¦λ μ¬μ©μλ₯Ό μν μ½ν
μΈ μ
λλ€.
{% else %}
νμν©λλ€!
λ λ§μ μ½ν
μΈ μ μ κ·Όνλ €λ©΄ λ‘κ·ΈμΈνμμμ€.
{% endif %}
{% endblock %}
2. λ§€ν¬λ‘ μ¬μ©
Jinja2 λ§€ν¬λ‘λ Pythonμ ν¨μμ μ μ¬ν©λλ€. μ΄λ€μ ν νλ¦Ώ λ΄μμ νΈμΆν μ μλ μ¬μ¬μ© κ°λ₯ν HTML μ½λ μ‘°κ°μ μ μν μ μκ² ν΄μ€λλ€. λ§€ν¬λ‘λ νΌ μμ, νμ λ©λ΄, μ΄λ―Έμ§ κ°€λ¬λ¦¬ λ±κ³Ό κ°μ ν νλ¦Ώ κ΅¬μ± μμλ₯Ό λ§λλ λ° μ¬μ©λ μ μμ΅λλ€.
λ³λμ νμΌ(macros.html
)μ λ§€ν¬λ‘λ₯Ό μ μνλ μ:
{% macro input(name, type='text', value='') %}
{% endmacro %}
ν νλ¦Ώμμ λ§€ν¬λ‘λ₯Ό κ°μ Έμ μ¬μ©νλ μ:
{% from 'macros.html' import input %}
3. ν νλ¦Ώ νν°
ν
νλ¦Ώ νν°λ₯Ό μ¬μ©νλ©΄ ν
νλ¦Ώ λ΄μμ λ³μμ μΆλ ₯μ μμ ν μ μμ΅λλ€. Jinja2λ capitalize
, lower
, upper
, date
μ κ°μ μ¬λ¬ λ΄μ₯ νν°λ₯Ό μ 곡ν©λλ€. μμ λ§μ μ¬μ©μ μ§μ νν°λ₯Ό μ μν μλ μμ΅λλ€.
λ μ§λ₯Ό νμννκΈ° μν΄ date
νν°λ₯Ό μ¬μ©νλ μ:
κ²μμΌ: {{ post.date | date('%Y-%m-%d') }}
κ²°λ‘
Jinja2λ₯Ό μ¬μ©ν Flask ν νλ¦Ώ μμμ ν νλ¦Ώμ ꡬμ±νκ³ , μ½λ μ¬μ¬μ©μ±μ μ΄μ§νλ©°, μΉ μ ν리μΌμ΄μ μ λ°μ κ±Έμ³ μΌκ΄μ±μ 보μ₯νλ κ°λ ₯ν κΈ°μ μ λλ€. κΈ°λ³Έ ν νλ¦Ώ, λΈλ‘ μ μ λ° νμ ν νλ¦Ώμ μ£Όμ κ°λ μ μ΄ν΄ν¨μΌλ‘μ¨ μΉ κ°λ° μν¬νλ‘μ°λ₯Ό λ¨μννλ μ ꡬ쑰νλκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν ν νλ¦Ώμ λ§λ€ μ μμ΅λλ€. DRY (Don't Repeat Yourself) μμΉμ μμ©νκ³ ν νλ¦Ώ μμμ νμ©νμ¬ κ²¬κ³ νκ³ νμ₯ κ°λ₯ν μΉ μ ν리μΌμ΄μ μ ꡬμΆνμΈμ.
μ΄ ν¬κ΄μ μΈ κ°μ΄λλ Flask ν νλ¦Ώ μμμ κΈ°λ³Έ μΈ‘λ©΄μ λ€λ£¨μμ΅λλ€. μ΄ κΈμ μ€λͺ λ μμμ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ Flask νλ‘μ νΈμ ν νλ¦Ώ μμμ ν¨κ³Όμ μΌλ‘ ꡬννκ³ , μ μΈκ³ μ¬μ©μλ₯Ό μν μ ꡬμ±λκ³ μ μ§ κ΄λ¦¬ κ°λ₯νλ©° μΌκ΄λ μΉ μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€. μ΄λ¬ν κΈ°μ μ νλ‘μ νΈμ νΉμ μꡬ μ¬νμ λ§κ² μ‘°μ νκ³ Jinja2μ κ³ κΈ κΈ°λ₯μ νμνμ¬ ν νλ¦Ώ λμμΈ κΈ°λ₯μ λμ± ν₯μμν€μΈμ.