宏、繼承、包含、特殊變數
- 2019 年 10 月 7 日
- 筆記
主要內容:
1. 模板宏的使用
2. 宏定義在外部的使用
3. 模板的繼承
4. 模板的包含
5. Flask中的特殊變數和方法
模板宏的使用
大家可能是第一次接觸這個字,在這裡是什麼意思呢?宏其實就類似於python中的函數,宏的作用就是在模板中重複利用程式碼,避免程式碼冗餘。
我們來看一個宏的寫法(不帶參數的宏):
{% macro input() %} <input type="text" name="username" value="" size="30"/>{% endmacro %}
上面程式碼中,其實就類似於在python中定義了一個名為input的函數。
定義了這個宏,那該如何去使用它?
{{ input()}}
直接通過兩個大括弧就ok了
既然有不帶參數的宏,肯定有帶參數的宏,如何寫?看下面:
{% macro input(name,value='',type='text',size=20) %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}" size="{{ size }}"/>{% endmacro %}
使用:
{{ input(value='name',type='password',size=40)}}
相信大家仔細看一下程式碼就能夠明白這是什麼意思,大家完完全全可以按照函數的思想去對待宏。
宏定義在外部的使用
宏除了在模板當中去編寫,還能單獨一個模板專門來寫宏嗎?答案當然是可以的,其實這一點也很類似於python。
Jinja2支援宏,還可以導入宏,需要在多處重複使用的模板程式碼片段可以寫入單獨的文件,再包含在所有模板中,以避免重複。
我們創建一個macro.html文件
{% macro input() %} <input type="text" name="username" placeholde="Username"> <input type="password" name="password" placeholde="Password"> <input type="submit">{% endmacro %}
在其他模板當中使用,需要先導入:
{% import 'macro.html' as func %}{% func.input() %}
模板的繼承
模板繼承是為了重用模板中的公共內容。一般Web開發中,繼承主要使用在網站的頂部菜單、底部。這些內容可以定義在父模板中,子模板直接繼承,而不需要重複書寫。
{% block top %}``{% endblock %}
標籤定義的內容,相當於在父模板中挖個坑,當子模板繼承父模板時,可以進行填充。
子模板使用extends指令聲明這個模板繼承自哪?父模板中定義的塊在子模板中被重新定義,在子模板中調用父模板的內容可以使用super()。
例如我們創建一個父模板base.html
{% block top %} 頂部菜單{% endblock top %} {% block content %}{% endblock content %} {% block bottom %} 底部{% endblock bottom %}
子模板:
{% 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中的特殊變數和方法
這裡給大家補充一下Flask當中的一些特殊的變數和方法,大家之前肯定也看到過。
config 對象:
config 對象就是Flask的config對象,也就是 app.config 對象。 {{ config.SQLALCHEMY_DATABASE_URI }}
request 對象:
就是 Flask 中表示當前請求的 request 對象,request對象中保存了一次HTTP請求的一切資訊。
request常用的屬性如下:
屬性 |
說明 |
類型 |
---|---|---|
data |
記錄請求的數據,並轉換為字元串 |
* |
form |
記錄請求中的表單數據 |
MultiDict |
args |
記錄請求中的查詢參數 |
MultiDict |
cookies |
記錄請求中的cookie資訊 |
Dict |
headers |
記錄請求中的報文頭 |
EnvironHeaders |
method |
記錄請求使用的HTTP方法 |
GET/POST |
url |
記錄請求的URL地址 |
string |
files |
記錄請求上傳的文件 |
* |
url_for 方法:
url_for() 會返回傳入的路由函數對應的URL,所謂路由函數就是被 app.route() 路由裝飾器裝飾的函數。如果我們定義的路由函數是帶有參數的,則可以將這些參數作為命名參數傳入。
{{ url_for('index') }} {{ url_for('post', post_id=1024) }}
get_flashed_messages方法:
返回之前在Flask中通過 flash() 傳入的資訊列表。把字元串對象表示的消息加入到一個消息隊列中,然後通過調用 get_flashed_messages() 方法取出。
{% for message in get_flashed_messages() %} {{ message }}{% endfor %}
這裡多說兩句,get_flashed_messages() 所處理的資訊只能看一次,也就是說你訪問過裡面的資訊一次了,第二次你就看不到了,我們也稱之為閃現。
這個是如何實現的呢?它的數據其實是存儲在session當中,當你訪問了一次之後就會進行刪除。用到了session所以我們需要設置SERECT_KEY(之前我們有寫過) 不然就會報錯。