Flask-1-07-模板-過濾器

模板


用 Python 生成 HTML 十分無趣,並且至關繁瑣,由於你必須手動對 HTML 作轉義來保證應用的安全。爲此,Flask 配備了 Jinja2 模板引擎。

你可使用 render_template() 方法來渲染模板。你須要作的一切就是將模板名和你想做爲關鍵字的參數傳入模板的變量。這裏有一個展現如何渲染模板的簡例:在template_demo.py中定義視圖函數index

# coding:utf-8

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
@app.route('/<name>')
def index(name=None):
    # 使用render_template()來渲染模板 參數第一個爲模板頁面,第二個爲向模板傳入的參數,若是爲多個值依次傳入
    return render_template('index.html', name=name)


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=12345, debug=True)

Flask 會在 templates 文件夾裏尋找模板。因此,若是你的應用是個模塊,這個文件夾應該與模塊同級:

 

在templates文件夾下建立index.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title</title>
</head>
<body>
    {% if name %}
        <h1>Hello {{ name }} </h1>
    {% else %}
        <h1>Hello World </h1>
    {% endif%}
</body>
</html>

運行templates_Demo.py,在瀏覽器中訪問127.0.0.1::12345/ 和 127.0.0.1:12345/circle

 

 

 

render_template()方法第一個參數就是找到你須要指定的模板,第二個參數就是向模板傳入變量,若是是多個變量能夠在後面一次傳入就能夠

render_template('index.html', name=name, age=18 .....) 傳入多少均可以

那麼問題來了,若是我有一大堆數據,難道真的要一個一個傳入嗎?那是否是看起來有點瘮人啊,那咱們就來傳入一個字典看看會是怎樣的

def index(name=None):
    data = {
        'name': name,
        'age': 18
    }
    return render_template('index.html', data)

顯然這還不行的,這裏報了一個類型錯誤,說明不能接受字典類型數據,那麼能夠利用**將字典拆包的放入就應該能夠的

# 將字典拆包的方式傳入方法中
return render_template('index.html', **data)

接下來咱們再來訪問一下

顯然這種方式是被接受的。注意這裏咱們用到的模板沒有更改,使用的都是上面的模板,因此沒有從新給出

字典當中若是包含了一個字典或者列表咱們的模板中應該如何接收呢?

def index(name=None):
    data = {
        'name': name,
        'age': 18,
        'my_dict': {'city': 'harbin'},
        'my_li': [1, 2, 3, 4, 5],
    }
    return render_template('index.html', **data)

模板代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title</title>
</head>
<body>
    {% if name %}
        {#  {{ 寫入傳入的變量名 }}      #}
        <h1>Hello {{ name }} </h1>
        <hr>
        <h1>age {{ age }} </h1>
        <hr>
        {#   第一種獲取字典的方式     #}
        <h1>my_dict {{ my_dict['city'] }} </h1>
        <hr>
        {#   第二種獲取字典的方式     #}
        <h1>my_dict {{ my_dict.city }} </h1>
        <hr>
        {#   獲取列表的方式     #}
        <h1>my_li {{ my_li }} </h1>
        <hr>
        {# 遍歷列表 #}
        {% for li in my_li %}
            <h1>my_li {{ li }} </h1>
        {% endfor %}
        <hr>
        {# 獲取列表中的單個值,這裏獲取的是第一個元素 #}
        <h1>my_li {{ my_li[0] }} </h1>
        <hr>
    {% else %}
        <h1>Hello World </h1>
    {% endif%}
</body>
</html>

訪問結果

固然模板變量也是支持變量相加的

        <h1>my_li[0] + my_li[1] = {{ my_li[0] + my_li[1] }} </h1>
        <h1>{{ "hello" + "worlds" }} </h1>

 

 

過濾器 

safe:禁用轉義html

  <p>{{ '<em>hello</em>' | safe }}</p>flask

capitalize:把變量值的首字母轉成大寫,其他字母轉小寫;api

  <p>{{ 'hello' | capitalize }}</p>瀏覽器

lower:把值轉成小寫;安全

  <p>{{ 'HELLO' | lower }}</p>app

upper:把值轉成大寫;ide

  <p>{{ 'hello' | upper }}</p>函數

title:把值中的每一個單詞的首字母都轉成大寫;spa

  <p>{{ 'hello' | title }}</p>debug

trim:把值的首尾空格去掉;

  <p>{{ ' hello world ' | trim }}</p>

reverse:字符串反轉;

  <p>{{ 'olleh' | reverse }}</p>

format:格式化輸出;

  <p>{{ 'name = %s , age =  %d' | format('name',17) }}</p>

striptags:渲染以前把值中全部的HTML標籤都刪掉;

  <p>{{ '<em>hello</em>' | striptags }}</p>

這裏就不一一展現了。須要哪一個拿去用就好,可是有意思的一點是,過濾器能夠連續使用。可是不限定爲2個

<p>{{ 「 hello world  「 | trim | upper }}</p>

列表過濾器

first:取第一個元素

  <p>{{ [1,2,3,4,5,6] | first }}</p>

 

last:取最後一個元素

  <p>{{ [1,2,3,4,5,6] | last }}</p>

 

length:獲取列表長度

  <p>{{ [1,2,3,4,5,6] | length }}</p>

 

sum:列表求和

  <p>{{ [1,2,3,4,5,6] | sum }}</p>

 

sort:列表排序

  <p>{{ [6,2,3,1,5,4] | sort }}</p>

上面給出的過濾器固然會有不知足本身使用的時候,既然有需求就會有本身動手來定義過濾器的願望,那麼咱們來實現它

自定義一個過濾列表的過濾器,需求過濾列表步長爲2,也就是間隔一個取一個值,定義流程,首先定義一個自定義過濾器函數,而後將自定義過濾器註冊,註冊的同時指定是那個過濾器,和過濾器的名字

 1 # coding:utf-8
 2 
 3 from flask import Flask, render_template
 4 
 5 app = Flask(__name__)
 6 
 7 
 8 @app.route('/')
 9 @app.route('/<name>')
10 def index(name=None):
11     data = {
12         'name': name,
13         'age': 18,
14         'my_dict': {'city': 'harbin'},
15         'my_li': [1, 2, 3, 4, 5],
16     }
17     return render_template('index.html', **data)
18 
19 
20 def list_step_2(li):
21     """自定義過濾器"""
22     return li[::2]
23 
24 
25 # 註冊過濾器
26 app.add_template_filter(list_step_2, 'li2')
27 
28 
29 if __name__ == "__main__":
30     app.run(host='0.0.0.0', port=12345, debug=True)
Python代碼
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>title</title>
 6 </head>
 7 <body>
 8     <h1>過濾my_li = {{ my_li | li2 }}</h1>
 9 </body>
10 </html> 
模板代碼

展現結果

備註: add_template_filter() 第一個參數是指定的函數名,第二個參數是定義的過濾器名字

另外一種自定義過濾器的方式,這裏咱們定義一個只返回列表第一個元素的過濾器,定義流程,首先定義一個過濾器函數,而後已裝飾器的方式註冊過濾器,使用template_filter()參數寫上過濾器的名字

 1 # coding:utf-8
 2 
 3 from flask import Flask, render_template
 4 
 5 app = Flask(__name__)
 6 
 7 
 8 @app.route('/')
 9 @app.route('/<name>')
10 def index(name=None):
11     data = {
12         'name': name,
13         'age': 18,
14         'my_dict': {'city': 'harbin'},
15         'my_li': [1, 2, 3, 4, 5],
16     }
17     return render_template('index.html', **data)
18 
19 
20 # 第一種方式添加過濾器
21 def list_step_2(li):
22     """自定義過濾器"""
23     return li[::2]
24 
25 
26 # 第二種凡是添加過濾器
27 @app.template_filter("fir")
28 def list_first_element(li):
29     return li[0]
30 
31 
32 # 註冊過濾器
33 app.add_template_filter(list_step_2, 'li2')
34 
35 
36 if __name__ == "__main__":
37     app.run(host='0.0.0.0', port=12345, debug=True)
Python代碼

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>title</title>
 6 </head>
 7 <body>
 8     <h1>第1種添加過濾器方式 過濾my_li = {{ my_li | li2 }}</h1>
 9     <h1>第2種添加過濾器方式 過濾my_li = {{ my_li | fir }}</h1>
10 </body>
11 </html> 
模板代碼

展現效果

相關文章
相關標籤/搜索