雖然 Django 內建的樣版引擎(template engine)多數情況下已經夠用,但也可以考慮蠻多人使用的 Jinja2 ,使用起來也很方便,頗受好評。

本文將展示如何在 Django 中整合 Jinja2 這套樣版引擎(template engine) 。

本文環境

- Ubuntu 16.04
- Python 3.5.2
- Django 1.10.6

安裝 Jinja2

安裝 Jinja2 的步驟很簡單,透過 pip 就可以進行安裝了:

$ pip install Jinja2

設定 settings.py

Django 整合 Jinja2 的主要步驟就是修改 settings.py 中的 TEMPLATES 設定即可,例如:

# settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [
            os.path.join(BASE_DIR, 'your_path', 'templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'autoescape': True,
        }
    },
]

上方的設定代表 os.path.join(BASE_DIR, 'your_path', 'templates') 中可以存放 jinja2 的樣版之外,各個 app 底下的 templates 資料夾也可以存放 jinja2 的樣版(如果要固定只有一個地方可以存放樣版的話可以把 APP_DIRS 改為 False ) 。

然後最重要的是 jinja2 目前 autoescape 設定是關閉的,為了避免 XSS 攻擊,建議在 OPTIONS 中加入 'autoescape': True ,將 autoescape 功能打開增加安全性。

使用 Jinja2

設定完 settings.py 之後,樣版 render 的方法依然一樣,只有樣版語法需要改為 Jinja2 的語法,所以 views.py 裡的寫法還是可以用 Django 內建的 render 方法:

# views.py
from django.shortcuts import render

def index(request, **kwargs):
    context = {
        'foo': 'Hello World',
    }
    return render(request, 'index.html', context=context)
# templates/index.html

{{foo}}  # will display 'Hello World' here

以上就是大致整合 Jinja2 的過程,有興趣的話可以閱讀參考資料了解更多。

參考資料

https://docs.djangoproject.com/en/1.11/topics/templates/