1. 程式人生 > >Flask中模板及其使用(一)

Flask中模板及其使用(一)

                                                                  Flask中模板及其使用
    所謂模板,其實就是一個包含響應文字的檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的值需要從使用的資料中獲取.在Flask中,模板使用的就是Jinja2引擎.
# 模板並不特指HTML檔案,HTML檔案只是模板的一種.

檢視的作用:(未使用模板時)
    在前面面的示例中,檢視函式的主要作用是生成請求的響應,這是最簡單的請求。實際上,檢視函式有兩個作用:處理業務邏輯和返回響應內容。在大型應用中,把業務邏輯和表現內容放在一起,會增加程式碼的複雜度和維護成本。本節學到的模板,它的作用即是承擔檢視函式的另一個作用,即返回響應內容。

模板作用
返回響應內容,此時不再由檢視返回.
<1>模板其實是一個包含響應文字的檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的值需要從使用的資料中獲取
<2>使用真實值替換變數,再(控制)返回最終得到的字串,這個過程稱為“渲染”。
<3>Flask是使用 Jinja2 這個模板引擎來渲染模板

Jinja2
<1>.Jinja2:
    是 Python 下一個被廣泛應用的模板引擎,是由Python實現的模板語言,他的設計思想來源於 Django 的模板引擎,並擴充套件了其語法和一系列強大的功能,是Flask內建的模板語言。
<2>.模板語言:
    是一種被設計來自動生成文件的簡單文字格式,在模板語言中,一般都會把一些變數傳給模板,替換模板的特定位置上預先定義好的佔位變數名。

渲染模板函式
<1>Flask提供的 render_template 函式封裝了該模板引擎
<2>render_template 函式的第一個引數是模板的檔名,後面的引數都是鍵值對,表示模板中變數對應的真實值。

一.模板的使用
# 通過函式呼叫
# 語法:render_template('選擇的模板名', '模板中傳入變數=變數')  此函式封裝了模板引擎Jinja2

from flask import Flask
from flask_script import Manager
from flask import render_template
--------部分程式碼省略
@app.route('/')
def index():
    # return '<h1>hello world</h1>'  # 瀏覽器可以渲染超文字標記語言
    return render_template('demo8.html')  # 模板中資料固定

if __name__ == '__main__':
    # 代替app 呼叫run方法
    manager.run()

# def render_template(template_name_or_list, **context):
    """Renders a template from the template folder with the given
    context.

    :param template_name_or_list: the name of the template to be
                                  rendered, or an iterable with template names
                                  the first one existing will be rendered
    :param context: the variables that should be available in the
                    context of the template.
    """

二.動態傳入資料給模板
1.變數  # 用在模板中
儲存資料,被動過程.將傳入模板的資料全部輸出.
語法:{{變數名}}  # 模板中使用,和Djnago中模板變數相同
@app.route('/')
def index():
    info = 'oo'
    return render_template('demo1.html', info=info) # 將變數info寫入模板檔案中

2.語句  # 用在模板中
作用:控制輸出,主動過程.在模板中,對傳入的資料進行選擇性輸出.
<1>條件語句/判斷語句
語法:{% if 表示式 %}{% elif 表示式 %}{% endif %}

<2>.迴圈語句
語法:{% for %}{% endfor %},必須有結束語句,用來結束程式碼.
快捷鍵:Table
# .py   
# 使用哪個模板,傳遞哪些資料給選中模板
@app.route('/')
def index():
    # return '<h1>hello world</h1>'  # 瀏覽器可以渲染超文字標記語言
    # return render_template('demo8.html')  #
    info = 'oo'
    # return render_template('demo8.html', info=info)
    my_list = [1, 4, 7, 21]
    return render_template('demo.html', my_list=my_list)

#demo.html
# 輸出哪些資料
{# 變數語法 #}
{{ info }}
{# {{ my_list }}#}
{% for index in my_list %}
    {% if index > 4 %}
{#        <p>index</p>#}
        <p>{{ index }}</p>
    {% endif %}
{% endfor %}  # 結束程式碼塊,python中用縮排來結束


# 注意: 變數用的是雙括號,語句用的是單括號.
模組化:把具體的功能模組拆分出去,達到解耦合.

三.過濾器
       
過濾器的本質就是函式。有時候我們不僅僅只是需要輸出變數的值,我們還需要修改變數的顯示,甚至格式化、運算等等,而在模板中是不能直接呼叫 Python 中的某些方法,那麼這就用到了過濾器
用途:格式化輸出資料,用在模板中.
本質:函式
語法:{{variable | filter_name(*args)}}   #  控制變數值格式化輸出,所以用雙括號.如果沒有任何引數傳給過濾器,則可以把括號省略掉.   # 控制變數值格式化輸出,所以用雙括號.
# 過濾器支援鏈式呼叫,即多個過濾器從前到後依次呼叫.{{variable | filter_name1(*args) | filter_name2(*args} | ...}  
1.過濾器的使用
<1>字串處理
safe: 禁用轉義,確認資料沒有安全隱患的前提下(模板預設情況下開啟轉義,即將字串中的<>&' ” 特殊字元,當成原始字串進行輸出.開啟轉義是處於安全考慮)
capitalize:首字母大寫,其餘字母小寫;
lower:轉小寫
upper:轉大寫
title:把值中的每個單詞的首字母都轉成大寫
format:格式化輸出   <p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染之前把值中所有的HTML標籤都刪掉
                 <p>{{ '<em>hello</em>' | striptags }}</p>
reverse: 字串反轉
2.列表處理
first:獲取列表中第一個元素.
last: 獲取列表中最後一個元素.
length: 獲取列表中元素數量.
sum: 對列表中資料進行求和.
sort: 對列表進行排序.
3.語句塊操作
{% filter upper %}
    #一大堆文字#
{% endfilter %}
4.自定義過濾器
       過濾器的本質是函式。當模板內建的過濾器不能滿足需求,可以自定義過濾器。自定義過濾器有兩種實現方式:
       一種是通過Flask應用物件的 add_template_filter 方法
       另一種是通過裝飾器來實現自定義過濾器。
重要:自定義的過濾器名稱如果和內建的過濾器重名,會覆蓋內建的過濾器。

需求:新增列表反轉的過濾器

方式一

通過呼叫應用程式例項的 add_template_filter 方法實現自定義過濾器。該方法第一個引數是函式名,第二個引數是自定義的過濾器名稱:
# 自定義的過濾器
def do_listreverse(li):
    # 通過原列表建立一個新列表
    temp_li = list(li)
    # 將新列表進行返轉
    temp_li.reverse()
    return temp_li

app.add_template_filter(do_listreverse,'lireverse')
方式二

用裝飾器來實現自定義過濾器。裝飾器傳入的引數是自定義的過濾器名稱。
# 自定義的過濾器
@app.template_filter('lireverse')
def do_listreverse(li):
    # 通過原列表建立一個新列表
    temp_li = list(li)
    # 將新列表進行返轉
    temp_li.reverse()
    return temp_li
在 html 中使用該自定義過濾器
<br/> my_array 原內容:{{ my_array }}
<br/> my_array 反轉:{{ my_array | lireverse }}
執行結果
my_array 原內容:[3, 4, 2, 1, 7, 9] 
my_array 反轉:[9, 7, 1, 2, 4, 3]