mako模板學習筆記

2022-03-30 11:01:18 字數 2754 閱讀 5999

前面已經轉過一篇mako模板的呼叫方法,看了看也挺簡單的,這次主要是學習模板的編寫語法。之所以選擇mako模板,除了它的口碑好之外,主要是我受不了web.py自帶模板了,特別是控制結構那裡,沒有使用結束標記,非得縮排使用才行,嚴重影響頁面的編排。因為沒有搜到有現成的中文教程,就勉強看官方的英文原版了。做個學習記錄在此。

mako語法

mako模板可以是任何文字流形式的檔案,html、xml都行,當然txt文字也是可以的。不過web.py裡面如果使用render_mako的話還是只認html的。mako會從中查詢變數、函式、定義塊等進行執行,而且定義塊裡面可以直接編寫python**。嘿嘿,神氣得很吶。

1、變數

mako中使用「${}」來定義變數格式,舉個例子,在default.html中編寫:

顯示變數temp的值:$

變數temp乘2:$

變數temp的平方:$

呼叫例項,在web.py中定義

class index:

def get(self):

temp = 10

return render.default(temp=temp)

執行結果:

顯示變數temp的值:10

變數temp乘2:20

變數temp的平方:100

2、轉義符

在定義變數時,如果其中包含特殊符號時記得要使用轉義符轉換。u負責轉換url位址,h轉換html,x對xml進行轉義,trim就是去空格啦。

url: $

url(with escaping): $

html: $

html(with escaping): $

看看輸出就明白了

url: there is some text

url(with escaping): there+is+some+text

html: show html(with escaping): show

3、控制結構

mako模板中使用%來定義控制結構,像if、for、try之類的,關鍵的就是要使用「%end」來關閉控制結構。這個應該很好理解了,上個菜:

% for a in [0,1,2,3,4,5,6,7,8,9]

% if a%2==0:

$是偶數

% else:

$是奇數

% endif

% endfor

顯示結果:

0是偶數

1是奇數

2是偶數

3是奇數

4是偶數

5是奇數

6是偶數

7是奇數

8是偶數

9是奇數

4、注釋

這個沒什麼好說的,兩個井號##是當行注釋,而<%doc>和中間可以寫多行注釋

5、換行過濾

同python**中一樣,可以使用「\」來強制不換行。

測試mako模板中可\

換行否

6、python**塊

在mako模板中可以直接寫py**,這是個功能很強大的地方,python**寫在<%和%>之間即可。

<%

x = [1,2,3,4,5,6,7,8,9,0]

y = [z for z in x if z%2==0] # 僅選擇偶數出來

%>

% for elem in y:

element: $

% endfor

輸出結果:

element: 2

element: 4

element: 6

element: 8

element: 0

7、模組級**

上面有說可以直接在mako中上一般的python**,還有更強大的地方,可以在引入模組和定義函式等等,在<%! %>中定義即可。

這個模組級別的**塊是在引入mako模板時直接載入到記憶體中的,是優先於render定義的。所以並不能直接用來進行頁面內容的輸出。我個人感覺就是如果使用<%! %>來引入了模組和函式,就相當於在後台code中引入,可以作為發布後修改code的補丁形式。

<%!

import mylib...

import re

def filter(text):

return re.sub(r"^@", "", text)

%>

8、標籤

mako模板中其他的一些功能都是通過標籤來定義的,定義格式為<%tagname>。前面的多行注釋<%doc>就是標籤裡的一種。

官方文件對每個標籤都有詳細的描述,特別是像<%def>、<%namespace>、<%inherit>等都有專門的篇章進行介紹的。

<%page>  定義模板的頁面資訊

<%include>  引入其他檔案

<%def>  定義python函式

<%namespace>  命名空間,有點.net的感覺

<%inherit>  繼承父模板

<%namespacename:defname>  呼叫其他命名空間中的函式

<%call>  一樣的呼叫函式

<%doc>  前面有了,就是注釋

<%text>  doc,類似於python的三引號。使用filter定義轉義(h/u/t)

-the end-

mako模板基礎

mako模板算是python裡面比較出色的乙個模板了,它宣稱有比jinja2更快的解析速度已經更多的語法支援,本篇部落格對它的使用做乙個小結。使用pip可以方便的安裝 無需root許可權,安裝到使用者目錄下 pip install mako user python2 pip3 install mak...

用mako增強django模板,用法像jsp

django預設的模板功能還可以,但是不能直接用python的語法,mako解決了這個痛點,使得django的模板變得像jsp一樣,可以直接使用python的語法做一些事情。mako django mako demo 直接的類似python string format的樣子 from mako.te...

Mako模板引擎安裝及在Django中的整合

最近使用django做專案,覺得自帶模板侷限性很大,使用起來自由度不高,最終還是痛下決心換mako模板。找到一篇文章,講述如何在django的基礎上安裝mako並使用。mako模板引擎安裝及在django中的整合 作業系統 linux cent os 5 max os x 10.6 snow leo...