在生產環節下,咱們要把後端程序(其實就是python)計算出來的數據和html頁面結合起來作,這個時候模版就派上大用處了。css
Jinja是日本寺廟的意思,而且寺廟的英文temple和template發音類似。JinaJa是Flask默認的仿DJango模版的一個模版引擎,由Flask做者開發。它速度快,被普遍使用,而且提供了可選的沙箱模版來保證執行環境的安全。它有以下優勢:html
默認安裝Flask 的時候也會把Jinja2給安裝上。若是沒有安裝能夠單獨安裝下。python
[root@localhost FlaskPratcie]# pip list |grep Jinja2 # 檢查是否安裝 [root@localhost FlaskPratcie]# pip install Jinja2 # 沒有安裝就給安裝下
咱們看看最簡單模版用法,這個jinja2語法也是適用於Django.shell
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul id="navigation'"> {% for item in items %} <li><a href="{ item.href}"> {{ item.caption }}</a></li> {% endfor %} </ul> <h1>{{ title | trim }}</h1> </body> </html>
語法解釋:編程
合理使用模版繼承,讓模版重複使用,可以提升工做效率和代碼質量。flask
<!DOCTYPE html> <html lang="en"> <head> {% block head %} <meta charset="UTF-8"> <title>Title</title> {% endblock %} </head> <body> <div> {% block content %} <ul id="navigation'"> heheh </ul> {% endblock %} </div> <div> {% block footer %} {% endblock %} </div> </body> </html>
咱們再看看子模版的內容:後端
{% extends 'simple.html' %} {% block title %} index {% endblock %} {% block head %} {{ super() }} <style type="text/css"> .import { color: #000;} </style> {% endblock %}
語法解釋:安全
{% extends 'simple.html' %} {% block title %} index {% endblock %} <h1>{{ self.title() }}</h1> # 再次使用title這個塊
宏相似於常規編程語言中的函數,它用於把平常行爲抽象成可重複用的函數編程語言
from jinja2 import Template print Template(''' {% macro hello(name)%} HEllo {{ name }} {% endmacro %} <p> {{ hello('ljf') }}</p> ''').render()
經過set爲變量賦值。函數
from jinja2 import Template print Template(''' {% set a = 1 %} {% set b,c = range(2) %} <p> {{a }} {{ b }} {{ c }} </p> ''').render()
include 語句包含一個模版,渲染的時候會在include語句對應位置添加被包含的模塊內容。
{% include 'header.html' %} html_body {% include 'footer.html' %}
include同時還支持「ignore missing」,若是模版不存在,Jinja會忽略這條語句:
{% include 'header.html' ignore missing %}
Jinja 支持不一樣的模版中導入宏並使用,與Python中import語句相似。有兩種方式來導入模版,能夠把整個模版導入到一個變量(import xx)或者從其中導入特定的宏(from xxx import xxx。
咱們如今寫一個宏模版,文件名爲hong1.html:
{% macro hello(name) %} hello {{ name }} {% endmacro %} {% macro strftime(time,fmt='%Y-%m-%d %H:%M:%S') %} {{ time.strftime(fmt) }} {% endmacro %}
咱們在寫一個文件,這個文件名爲hello_macro.html,咱們這個hello_macro.html裏面導入hong1.html,注意,兩個文件在同一個目錄下面。代碼以下:
{% import 'hong1.html' as macro %} {% from 'hong1.html' import hello as _hello,strftime %} </p>{{ macro.hello('Leo') }}</p> </p>{{ strftime(time) }}</p>
寫完以後,咱們在寫一個py文件,內容以下:
from jinja2 import FileSystemLoader,Environment from datetime import datetime loader = FileSystemLoader('/root/PycharmProjects/FlaskPratcie/templates/chapter3/section1/') # 這個是導入hello_macro.html所在的父目錄便可 template = Environment(loader=loader).get_template('hello_macro.html') print(template.render(time=datetime.now()))
寫完後執行py文件,打印的信息以下:
</p> hello Leo </p> </p> 2017-04-19 23:34:28 </p>
打印出來的結果若是你的和我同樣,說明宏已經可以正確導入了。