Web 應用中,Python 程式碼負責業務邏輯(Controller),HTML 模板負責呈現邏輯(View),資料模型(Model)在兩者間流動。Jinja2 是 Flask 預設、功能強大的模板引擎。本文完整說明 MVC 架構、模板語法、繼承與進階技巧。

$ pip install jinja2
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('home.html')
@app.route('/signin', methods=['GET'])
def signin_form():
return render_template('form.html')
@app.route('/signin', methods=['POST'])
def signin():
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'password':
return render_template('signin-ok.html', username=username)
return render_template('form.html',
message='Bad username or password',
username=username)
project/
├── app.py
└── templates/
├── home.html
├── form.html
└── signin-ok.html

{{ username }} # 簡單變數
{{ user.name }} # 物件屬性
{{ user['name'] }} # 字典鍵值
{{ user.name|upper }} # 過濾器
{% if message %}
{{ message }}
{% endif %}
{% for user in users %}
{{ user.name }}
{% endfor %}
{% for i in range(1, 6) %}
{{ i }}
{% endfor %}
{# base.html #}
{% block title %}Default{% endblock %}
{% block content %}{% endblock %}
{# child.html #}
{% extends "base.html" %}
{% block title %}Child Page{% endblock %}
{% block content %}
Child Content
{% endblock %}
{% include 'header.html' %}
{% include 'footer.html' %}
{% macro input(name, value='', type='text') %}
{% endmacro %}
{{ input('username') }}
{{ input('password', type='password') }}
| 過濾器 | 效果 |
|---|---|
| {{ name|upper }} | 大寫 |
| {{ text|truncate(30) }} | 截斷並加省略號 |
| {{ list|length }} | 長度 |
| {{ date|datetimeformat('%Y-%m-%d') }} | 日期格式化 |
| {{ html|safe }} | 標記為安全,不轉義 |
| {{ val|default('N/A') }} | 預設值 |
Jinja2 預設啟用自動轉義,{{ user_input }} 會將 < > & 轉為實體。若確定內容安全(如後端生成的 HTML),用 {{ html|safe }} 或 {% autoescape false %}...{% endautoescape %}。
| 引擎 | 語法特徵 | 特點 |
|---|---|---|
| Jinja2 | {{ var }}, {% ... %} | 功能豐富、效能佳、Flask 預設 |
| Mako | ${var}, <% ... %> | Python 語法嵌入、效能極高 |
| Cheetah | ${var}, <% ... %> | 早期成熟專案 |
| Django Template | {{ var }}, {% ... %} | Django 內建、語法較受限 |
TEMPLATES_AUTO_RELOAD = True,修改即時生效Jinja2 以豐富語法、模板繼承、宏、過濾器支援複雜 View 需求。MVC 分離讓 Python 專注業務邏輯,模板專注呈現,配合自動轉義提升安全性。掌握核心語法即可高效開發可維護的 Web 介面。