Flask中的一些問題的初步彙總四
Jinja2模板引擎簡介(template)
模板
檢視函式的主要作用是生成請求的響應,這是最簡單的請求。實際上,檢視函式有兩個作用:處理業務邏輯和返回響應內容。在大型應用中,把業務邏輯和表現內容放在一起,會增加程式碼的複雜度和維護成本。本節學到的模板,它的作用即是承擔檢視函式的另一個作用,即返回響應內容。
模板其實是一個包含響應文字的檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的值需要從使用的資料中獲取
使用真實值替換變數,再返回最終得到的字串,這個過程稱為“渲染”
Flask是使用 Jinja2 這個模板引擎來渲染模板
使用模板的好處:
檢視函式只負責業務邏輯和資料處理(業務邏輯方面)
而模板則取到檢視函式的資料結果進行展示(檢視展示方面)
程式碼結構清晰,耦合度低
Jinja2
兩個概念:
Jinja2:是 Python 下一個被廣泛應用的模板引擎,是由Python實現的模板語言,他的設計思想來源於 Django 的模板引擎,並擴充套件了其語法和一系列強大的功能,其是Flask內建的模板語言。
模板語言:是一種被設計來自動生成文件的簡單文字格式,在模板語言中,一般都會把一些變數傳給模板,替換模板的特定位置上預先定義好的佔位變數名。
渲染模版函式
Flask提供的 render_template 函式封裝了該模板引擎
render_template 函式的第一個引數是模板的檔名,後面的引數都是鍵值對,表示模板中變數對應的真實值。
{{}} 來表示變數名,這種 {{}} 語法叫做變數程式碼塊
{{ post.title }}
Jinja2 模版中的變數程式碼塊可以是任意 Python 型別或者物件,只要它能夠被 Python 的 str() 方法轉換為一個字串就可以,比如,可以通過下面的方式顯示一個字典或者列表中的某個元素:
{{your_dict[‘key’]}}
{{your_list[0]}}
用 {%%} 定義的控制程式碼塊,可以實現一些語言層次的功能,比如迴圈或者if語句
{% if user %} {{ user }} {% else %} hello! <ul> {% for index in indexs %} <li> {{ index }} </li> {% endfor %} </ul>
註釋
使用 {# #} 進行註釋,註釋的內容不會在html中被渲染出來
模板使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>flask網頁模板的學習</title>
</head>
<body>
<center>
<div>
<!-- 雙中括弧是輸出。單中括弧是邏輯判斷 以後的註釋要用{# #} -->
這是我們第一個網頁模板 <br /><br />
<!-- 這裡是註釋。最基本的模板語法輸出一個變數 -->
<!-- {{ my_str + ", 前端頁面" }} <br /><br /> -->
<!-- 模板語法可以做簡單的運算 -->
{{ my_int + 10 }} <br /><br />
<!-- list的操作,可以引用下表的方式輸出list元素 -->
{{ my_list }}<br />
{{ my_list[0] }}<br />
{{ my_list.1 }}<br /><br />
{# 這是模板的註釋方法 #} <br />
{{ my_dict["name"] }} <br />
{{ my_dict }} <br />
{{ my_dict.age }} <br />
{# 使用{% %} 來定義簡單的邏輯控制程式碼 #}
{% if my_int %}
整型存在
{% else %}
不存在
{# 使用if判斷。一定要有endif 用來結束邏輯判斷#}
{% endif %}
<ul>
{# 使用for迴圈來遍歷list #}
{% for item in my_list %}
<li>{{ item }}</li>
{# 使用for迴圈也要用endfor#}
{% endfor %}
</ul>
{# 使用if for 巢狀來實現單雙行背景色 #}
<table style="border:1px solid black;padding: 5px;">
{% for item in my_list %}
{% if loop.index % 2 == 0 %}
<tr style="background-color:tomato">
<td>{{ item }}</td>
</tr>
{% else %}
<tr style="background-color:violet">
<td>{{ item }}</td>
</tr>
{% endif %}
{% endfor %}
</table>
</div>
</center>
</body>
</html>
過濾器
過濾器的本質就是函式。有時候我們不僅僅只是需要輸出變數的值,我們還需要修改變數的顯示,甚至格式化、運算等等,而在模板中是不能直接呼叫 Python 中的某些方法,那麼這就用到了過濾器。
鏈式呼叫
{{ “hello world” | reverse | upper }}
上程式碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>flask過濾器的學習</title>
</head>
<body>
<center>
1.<br />
{# 過濾器呼叫方式 {{ 變數 | 過濾器的名稱 }} #}
safe過濾器,可以禁用轉義
{{ '<strong>hello</strong>' | safe }}
<br />
2.<br />
系統預設的過濾器,把大寫字母轉換為小寫
<br />
{{ 'HELLO' | lower }}
<br />
3.<br />
把小寫換為大寫
<br />
{{ 'hello' | upper }}
<br />
4.<br />
經典。字串反轉
<br />
{{ '來一個反轉' | reverse }}
<br />
5.<br />
首字母大寫。其餘字母小寫
<br />
{{ 'james' | capitalize }}
<br />
6.<br />
過濾所有的html標籤,em標籤是斜體。跟轉義沒有任何關係,只是在過濾標籤,把所有文字中的標籤過濾掉
<br />
{{ '<em>hello</em>' | striptags }}
<br />
7.<br />
只顯示list首個元素
<br />
{{ [100,99,65] | first }}
<br />
8.<br />
只顯示最後一個元素
<br />
{{ [100,90,520] | last }}
<br />
9.<br />
顯示一個list的長度
<br />
{{ [1,2] | length }}
<br />
10.<br />
對list裡面的所有元素求和
<br />
{{ [100,200] | sum }}
<br />
11.<br />
對list進行排序
<br />
{{ [12,3,4,56,7,89,8,76,5] | sort }}
<br />
12.<br />
對語句塊兒進行過濾 (相當於文字,以換大寫為例)
<br />
{% filter upper %}
hello world hello python hello flask hello filter hello csdn
{% endfilter %}
<br />
13.<br />
鏈式呼叫(巢狀的使用過濾器)
<br />
{{'abcdefg' | reverse | upper }} 雙管道呼叫,先反轉。後大寫
<br />
{{'abcdefg' | upper | reverse }} 執行的順序。誰先誰後
<br />
</center>
</body>
</html>
程式碼複用
巨集 —- 類似python中的函式
建立:
{% macro 標籤名(key=value)%} {% end macro %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>flask中的巨集程式設計</title>
</head>
<body>
減少重複的操作,定義一個巨集
{% macro input(value,type,id) %} 也可用簡寫的標籤來代表input替換為i 也可以,下邊的input直接用i
<input style="width:300px;" id="{{ id }}" type="{{ type }}" value="{{ value }}" />
{% endmacro %}
<br />
呼叫巨集 傳參的時候要和上邊的引數要等同
{{ input(type='text',value='使用者名稱',id="abc") }}
<!-- 上邊的巨集等同於這裡的普通html標籤<input type="text" value="使用者名稱"> -->
<br />
{{ input(type='button',value='按鈕',id="abc") }}
<br />
{{ input(type='password',value='密碼', id="abc") }}
</body>
</html>
巨集(Macro)、繼承(Block)、包含(include)均能實現程式碼的複用。
繼承(Block)的本質是程式碼替換,一般用來實現多個頁面中重複不變的區域。
巨集(Macro)的功能類似函式,可以傳入引數,需要定義、呼叫。
包含(include)是直接將目標模板檔案整個渲染出來。