5 JInja2模版(適用於Django和Flask)

模版

在生產環節下,咱們要把後端程序(其實就是python)計算出來的數據和html頁面結合起來作,這個時候模版就派上大用處了。css

Flask下的模版---Jinja2

Jinja是日本寺廟的意思,而且寺廟的英文temple和template發音類似。JinaJa是Flask默認的仿DJango模版的一個模版引擎,由Flask做者開發。它速度快,被普遍使用,而且提供了可選的沙箱模版來保證執行環境的安全。它有以下優勢:html

  • 讓HTML設計者和後端Python開發工做分離
  • 減小使用python的複雜度,頁面邏輯應該獨立於業務邏輯,這樣才能開發出易於維護的程序。
  • 模版很是靈活、快速和安全,對設計者和開發者會更友好
  • 提供了控制語句、繼承等高級功能,減小開發的複雜度。

默認安裝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>

語法解釋:編程

  • {# ... #} 模版註釋,他不會出如今渲染的頁面裏
  • {% ... %} 用於執行諸如for循環或者賦值的語句
  • {{ ... }} 用於把表達式的結果輸出到模版上
  • for 循環必須像shell腳步同樣,有結束標籤,這裏的就是{% for x in y %} .... {% endfor %}
  • 獲取變量的值,咱們有兩種方式獲取:
  1. {{ item.href }}
  2. {{ item['href'] }}
  • {{ title | trim }} trim是一個過濾器,在模版中經過管道符號(|)把變量和過濾器分開。咱們也能夠經過多個過濾器,如{{ title|trim|striptags }} 等。striptags也是一個過濾器,Jinja2內部提供了很是多的過濾器,點我查看其它過濾器

模版繼承

合理使用模版繼承,讓模版重複使用,可以提升工做效率和代碼質量。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>
  • {% block xxx%} ..... {% endblock %} 是一個代碼塊,能夠在子模版裏面重寫這個代碼塊裏面的內容,就等於python裏面的子類繼承父類後,能夠重寫一個和父類某個方法同名的方法來覆蓋掉父類的某一個方法。
子模版

咱們再看看子模版的內容:後端

{% extends 'simple.html' %}
{% block title %} index {% endblock %}
{% block head %}
    {{ super() }}
    <style type="text/css">
        .import {
            color: #000;}
    </style>
{% endblock %}

語法解釋:安全

  • {% extends 'xxx' %} 表示繼承這個母版,xxx是這個母版的文件名
  • super() 方法表示先使用母版裏面的base.html的head塊的內容,在這基礎之上添加css樣式
  • 若是你想用屢次使用一個塊,可使用特殊「self」 變量並調用與塊同名的函數,以下所示
{% 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()
  • macro 這個等同於python裏面的def,shell裏面的function ,js裏面的function同樣,定義一個方法罷了

賦值

經過set爲變量賦值。函數

from jinja2 import Template
print Template('''
 {% set a = 1 %}
 {% set b,c = range(2) %}
 <p> {{a }} {{ b }} {{ c }} </p>
''').render()

include

include 語句包含一個模版,渲染的時候會在include語句對應位置添加被包含的模塊內容。

{% include 'header.html' %}
    html_body
{% include 'footer.html' %}

include同時還支持「ignore missing」,若是模版不存在,Jinja會忽略這條語句:

{% include 'header.html' ignore missing %}

import

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>

打印出來的結果若是你的和我同樣,說明宏已經可以正確導入了。

相關文章
相關標籤/搜索