Python/Python Flask

Flask Jinja2 템플릿: 변수 및 필터 사용법

임베디드 친구 2025. 8. 30. 18:23
반응형

Flask Jinja2 템플릿: 변수 및 필터 사용법

Flask는 웹 애플리케이션 개발을 간단하게 만들어주는 Python 기반 프레임워크입니다. Flask에서 HTML 템플릿을 다룰 때 Jinja2 템플릿 엔진을 사용합니다. 이번 포스팅에서는 Jinja2 템플릿에서 변수필터를 사용하는 방법을 예제와 함께 자세히 설명하겠습니다.

1. Jinja2 템플릿 변수란?

Jinja2 템플릿 변수는 Python에서 전달된 데이터를 HTML에 삽입할 때 사용됩니다. 템플릿 변수는 {{ }} 구문을 사용하여 HTML 파일에서 선언합니다.

기본 변수 사용법

Python 코드에서 템플릿에 데이터를 전달하면 HTML 템플릿에서 해당 데이터를 표시할 수 있습니다.

# app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    name = "소프트웨어 공장"
    return render_template('index.html', name=name)

if __name__ == '__main__':
    app.run(debug=True)
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Flask Jinja2 예제</title>
</head>
<body>
    <h1>안녕하세요, {{ name }}!</h1>
</body>
</html>

결과적으로 브라우저에는 안녕하세요, 소프트웨어 공장!라는 메시지가 출력됩니다.


2. Jinja2 필터란?

필터는 템플릿 변수의 값을 변환하거나 조작하는 데 사용됩니다. 필터는 파이프(|) 기호를 사용하여 적용합니다. Jinja2에서 기본적으로 제공하는 필터는 여러 가지가 있으며, 필요에 따라 사용자 정의 필터도 만들 수 있습니다.

기본 필터 사용법

upper 필터

문자열을 대문자로 변환합니다.

<p>{{ name|upper }}</p>

위의 필터를 사용하면 소프트웨어 공장가 출력됩니다.

lower 필터

문자열을 소문자로 변환합니다.

<p>{{ name|lower }}</p>

결과는 소프트웨어 공장입니다.

length 필터

리스트, 문자열, 또는 기타 데이터의 길이를 반환합니다.

<p>이름의 길이: {{ name|length }}</p>

결과는 18입니다.


3. 필터와 변수 결합하기

여러 필터를 결합하여 사용할 수도 있습니다. 예를 들어, 아래 코드는 문자열을 대문자로 변환한 후 길이를 반환합니다.

<p>{{ name|upper|length }}</p>

결과는 18입니다.


4. 사용자 정의 필터 만들기

필요한 경우 Flask에서 사용자 정의 필터를 정의하여 사용할 수 있습니다.

사용자 정의 필터 예제

다음은 문자열을 거꾸로 뒤집는 사용자 정의 필터입니다.

# app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.template_filter('reverse')
def reverse_string(s):
    return s[::-1]

@app.route('/')
def index():
    name = "소프트웨어 공장"
    return render_template('index.html', name=name)

if __name__ == '__main__':
    app.run(debug=True)
<!-- templates/index.html -->
<p>이름을 거꾸로: {{ name|reverse }}</p>

결과는 oidutS nohtyP peeD가 출력됩니다.


5. 템플릿 변수와 필터 조합 예제

리스트 데이터 처리

Jinja2 템플릿 변수는 단순한 문자열 뿐만 아니라 리스트와 같은 복잡한 데이터 구조도 처리할 수 있습니다.

# app.py
@app.route('/items')
def items():
    items = ["Python", "Flask", "Jinja2"]
    return render_template('items.html', items=items)
<!-- templates/items.html -->
<ul>
    {% for item in items %}
        <li>{{ item|upper }}</li>
    {% endfor %}
</ul>

결과적으로 다음과 같은 HTML이 렌더링됩니다:

<ul>
    <li>PYTHON</li>
    <li>FLASK</li>
    <li>JINJA2</li>
</ul>

6. 템플릿 변수의 안전한 출력

Jinja2는 기본적으로 HTML에서 사용자 입력을 출력할 때 보안을 강화하기 위해 모든 데이터에 대해 HTML escaping을 적용합니다.

HTML escaping 예제

# app.py
@app.route('/safe')
def safe():
    unsafe_string = "<script>alert('XSS')</script>"
    return render_template('safe.html', unsafe_string=unsafe_string)
<!-- templates/safe.html -->
<p>{{ unsafe_string }}</p>

위 코드는 <script> 태그를 실제 HTML로 출력하지 않고, 문자열로 처리하여 안전하게 렌더링합니다.

출력 결과:

<p>&lt;script&gt;alert('XSS')&lt;/script&gt;</p>

마치며

Jinja2 템플릿에서 변수를 사용하고 필터를 적용하는 방법은 Flask 웹 애플리케이션 개발의 핵심 요소입니다. 이 포스팅에서는 기본 변수 사용법부터 다양한 필터, 사용자 정의 필터까지 다뤄보았습니다. 다음 포스팅에서는 Jinja2의 제어 구조와 매크로를 다뤄보겠습니다.

Flask와 Jinja2를 활용한 실습으로 더욱 풍성한 웹 애플리케이션을 만들어보세요!

반응형