flask 模板Template
flask 模板
- 檢視函式主要作用是生成請求的響應,包含兩個作用:處理業務邏輯和返回響應內容。
- 模板作用:承擔在大型專案內的返回響應內容的作用。
- 模板其實是一個包含響應文字的檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的值需要從使用的資料中獲取
使用真實值替換變數,再返回最終得到的字串,這個過程稱為“渲染”
Flask是使用 Jinja2 這個模板引擎來渲染模板
1 jinja2簡介
1 Flask內建的模板語言;2 模板語言是一種被設計來自動生成文件的簡單文字格式,在模板語言中,一般都會把一些變數傳給模板,替換模板的特定位置上預先定義好的佔位變數名。
使用:
變數程式碼塊:{{}}
<h1>{{ post.title }}</h1>
控制程式碼塊:{% %}
實現語言層次的一些功能,語句控制輸出。
if語句:
{% if 判別條件 %}
語句1
{% elif 判別條件 %}
語句2
{% endif %}
for 語句:
{% for data in data_list %}
迴圈語句
{% endfor %}
註釋語句:
{{# #}}
render_template
Flask提供render_template函式封裝模板引擎。
render_template 函式的第一個引數是模板的檔名,後面的引數都是鍵值對,表示模板中變數。
@app.route('/')
def index():
data = "itpycharm"
return render_template('temp_demo1.html',data=data)
2 模板的使用
專案下建立 templates 資料夾,其內放置所有模板檔案。
pycharm可以設定templates 資料夾屬性(mark)以便能夠在程式碼中有智慧提示。
設定 html 中的模板語言Templates,以便在 html 有智慧提示
3 過濾器
過濾器的本質就是函式。
過濾器:對字串的處理,格式化輸出資料。預設開啟轉義,會把變數的標籤使用字串形式顯示。基於模板函式render_template。
語法格式:{{變數 | 過濾器}}
支援鏈式呼叫。
<p>反轉首字母大寫:{{ 'ANiHc FO KnAb' | reverse | capitalize }}</p>
字串操作:
safe:禁用轉義,開始解析標籤字串。
{{ '<em>hello world</em>' | safe }}</p>
reverse:翻轉,原字串進行反序輸出
upper:大寫,原字串全部大寫。
lower:小寫,原字串全部小寫
title:把值中的每個單詞的首字母都轉成大寫
capitalize:首字元大寫。
format:格式化輸出;
列表操作:
last first sum length sort(排序)
format:格式化輸出
<p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染之前把值中所有的HTML標籤都刪掉
<p>{{ '<em>hello</em>' | striptags }}</p>
語句塊過濾:
{% filter upper %}
#一大堆文字#
{% endfilter %}
3.1 自定義過濾器
自定義過濾器有兩種實現方式:
注意:自定義的過濾器名稱如果和內建的過濾器重名,會覆蓋內建的過濾器。
方式一,add_template_filter 方法
通過呼叫Flask應用物件的 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 }}
1.1 控制程式碼塊
if 程式碼塊、for程式碼塊
在一個 for 迴圈塊中你可以使用loop特殊的變數訪問一些資訊:
變數 描述
loop.index 當前迴圈迭代的次數(從 1 開始)
loop.index0 當前迴圈迭代的次數(從 0 開始)
loop.revindex 到迴圈結束需要迭代的次數(從 1 開始)
loop.revindex0 到迴圈結束需要迭代的次數(從 0 開始)
loop.first 如果是第一次迭代,為 True 。
loop.last 如果是最後一次迭代,為 True 。
loop.length 序列中的專案數。
loop.cycle 在一串序列間期取值的輔助函式。
4 模板程式碼複用
使用 JinJa2 模板中的 巨集、繼承、包含方法實現減少多個模板中程式碼的重複。
模板巨集
對巨集(macro)的理解:
- 類似Jinja2 中的一個函式,它會返回一段HTML模板程式碼。
- 巨集可以寫在一個單獨檔案內,再讓多個模板進行呼叫。
使用 - 定義巨集
{% macro input(name,value='',type='text') %}
<input type="{{type}}" name="{{name}}"
value="{{value}}" class="form-control">
{% endmacro %}
- 呼叫巨集
{{ input('name' value='hello Python')}}
- 輸出
<input type="text" name="name"
value="hello Python" class="form-control">
抽取巨集HTML檔案
- 把巨集單獨抽取出來,封裝成html檔案,檔名可以自定義macro.html
{% macro function(type='text', name='', value='') %}
<input type="{{type}}" name="{{name}}"
value="{{value}}" >
{% endmacro %}
- 在其它模板檔案中先匯入,再呼叫
{% import 'macro.html' as macr %}
{% macr.function() %}
模板繼承
模板繼承可以多次使用重複的內容。
一般繼承主要使用在網站的頂部選單、底部。
父模板定義block 內容,子模板直接繼承使用。
定義格式:
{% block top %}
標籤定義的內容
{% endblock %}
- 子模板使用 extends 指令宣告這個模板繼承自哪個模板
- 父模板中定義的塊在子模板中被重新定義,在子模板中呼叫父模板的內容可以使用super()
父模板base.html
{% block top %}
頂部選單
{% endblock top %}
{% block content %}
{% endblock content %}
{% block bottom %}
底部
{% endblock bottom %}
子模板
extends指令宣告這個模板繼承自哪
{% extends 'base.html' %}
{% block content %}
子模板需要填充的內容
{% endblock content %}
- 模板繼承使用時注意點:
- 不支援多繼承
- 子模板第一行書寫extends,便於閱讀。
- 同一模板檔案,block名字不能重複
- 當在頁面中使用多個block標籤時,建議給結束標籤起個名字,當多個block巢狀時,閱讀性更好。
模板包含
Jinja2模板中,包含(Include)方法。
將另一個模板整個載入到當前模板中,並直接渲染。
Include的使用:
{% include 'hello.html' %}
包含在使用時,如果包含的模板檔案不存在時,程式會丟擲TemplateNotFound異常。加上 ignore missing 關鍵字,如果包含的模板檔案不存在,會忽略這條include語句。
Include 加上關鍵字ignore missing:
{% include 'hello.html' ignore missing %}
小結
巨集(Macro)、繼承(Block)、包含(include)均能實現程式碼的複用。
繼承(Block)的本質是程式碼替換,一般用來實現多個頁面中重複不變的區域。
巨集(Macro)的功能類似函式,可以傳入引數,需要定義、呼叫。
包含(include)是直接將目標模板檔案整個渲染出來。
模板特有變數和函式
Flask 預設內建模板的函式和物件。
config
你可以從模板中直接訪問Flask當前的config物件;
配置資料庫:
{{config.SQLALCHEMY_DATABASE_URI}}
mysql://root:mysql/database
request
就是flask中代表當前請求的request物件:
{{request.url}}
http://127.0.0.1
session
為Flask的session物件
{{session.new}}
True
g變數
在檢視函式中設定g變數的 name 屬性的值,然後在模板中直接可以取出
{{ g.name }}
url_for()
url_for會根據傳入的路由器函式名,返回該路由對應的URL,在模板中始終使用url_for()就可以安全的修改路由繫結的URL,則不比擔心模板中渲染出錯的連結:
{{url_for('home')}}
/
如果我們定義的路由URL是帶有引數的,則可以把它們作為關鍵字引數傳入url_for(),Flask會把他們填充進最終生成的URL中:
{{ url_for('post', post_id=1)}}
/post/1
get_flashed_messages()
這個函式會返回之前在flask中通過flask()傳入的訊息的列表,flash函式的作用很簡單,可以把由Python字串表示的訊息加入一個訊息佇列中,再使用get_flashed_message()函式取出它們並消費掉:
{%for message in get_flashed_messages()%}
{{message}}
{%endfor%}