Python Web開(kāi)發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié)
做 Web 開(kāi)發(fā)少不了要與模板引擎打交道。我陸續(xù)也接觸了 Python 的不少模板引擎,感覺(jué)可以總結(jié)一下了。
一、首先按照我的熟悉程度列一下:
pyTenjin:我在開(kāi)發(fā) Doodle 和 91 外教時(shí)使用。
Tornado.template:我在開(kāi)發(fā)知乎日?qǐng)?bào)時(shí)使用。
PyJade:我在開(kāi)發(fā)知乎日?qǐng)?bào)時(shí)接觸過(guò)。
Mako:我只在一個(gè)早期就夭折了的小項(xiàng)目里用過(guò)。
Jinja2:我只拿它做過(guò)一些 demo。
其他就不提了,例如 Django 的模板,據(jù)說(shuō)又慢又難用,我根本就沒(méi)接觸過(guò)。
二、再說(shuō)性能
很多測(cè)試就是弄個(gè)大循環(huán)什么的,很沒(méi)技術(shù)含量。其實(shí)模板的渲染時(shí)間主要消耗在字符串處理上,包括拼接、編碼、轉(zhuǎn)義等,而循環(huán)測(cè)的則是 Python runtime 的性能。
所以我還是用實(shí)際的例子來(lái)測(cè)試吧,最終選擇了 Doodle 的首頁(yè)。它有幾個(gè)子模板、幾個(gè)循環(huán)、幾個(gè)函數(shù)調(diào)用和很多個(gè)變量,具有一定代表性??紤]到 pyTenjin 以外的模板引擎不支持局部緩存,我就把用到緩存的側(cè)邊欄去掉了,只渲染主體部分。
渲染 1000 次的結(jié)果為:pyTenjin 耗時(shí) 0.65 秒,取消預(yù)處理后耗時(shí) 0.9 秒;Tornado.template 耗時(shí) 1.0 秒;Jinja2 耗時(shí) 1.1 秒。
測(cè)試代碼有幾百行,19 個(gè)文件,我就懶得列出來(lái)了。其他模板引擎也懶得測(cè)了。
@pyTenjin 的優(yōu)勢(shì)很明顯,特別是它支持預(yù)處理。這個(gè)預(yù)處理的主要作用是把一些常量先編譯好,渲染時(shí)就不用再處理了(因?yàn)橐呀?jīng)變成字符串了);此外,有些功能可以靜態(tài)地決定是否開(kāi)啟,而預(yù)處理可以把那些不需要的功能代碼(主要是 if 分支)提前去掉。此外還能緩存任意代碼段的渲染結(jié)果,在一段時(shí)間內(nèi)無(wú)需重新渲染。
@Jinja2 比 Tornado.template 慢是我沒(méi)想到的,好像與很多測(cè)試不符。
@Mako 預(yù)計(jì)和 Jinja2 差不多。它也能緩存代碼段的渲染結(jié)果。
@PyJade 需要把 Jade 模板轉(zhuǎn)成其他模板,且無(wú)緩存,預(yù)計(jì)會(huì)慢很多。
考慮到除 PyJade 外肯定不存在幾倍的性能差距,所以挑個(gè)好用的即可。
三、最后說(shuō)易用性
@pyTenjin 的優(yōu)點(diǎn)是可以寫(xiě)任意 Python 代碼。
缺點(diǎn)是標(biāo)記比較復(fù)雜和獨(dú)特,有 <?py ... ?>、<?PY ... ?>、#{...}、#{{...}}、{==...==}、{#==...==#}、${...}、${{...}}、{#=...=#} 和 {#==...==#} 這么多種,不過(guò)看上去還挺萌的。
由于使用了 < 和 > 符號(hào),在 HTML 標(biāo)簽內(nèi)部使用時(shí),會(huì)阻礙編輯器進(jìn)行語(yǔ)法解析。
另外,它的 tagattr() 方法在 expr 參數(shù)為 0 時(shí)當(dāng)成了 True 來(lái)處理,需要改源碼來(lái)修正,而它又沒(méi)有開(kāi)源項(xiàng)目可以提交 pull request。
而且它只有一個(gè)開(kāi)發(fā)者,已經(jīng)有一年多沒(méi)更新了,活躍度明顯不夠。
@Tornado.template 的優(yōu)點(diǎn)是與 Tornado 搭配還不錯(cuò)(畢竟是自帶的),功能和性能都還行。
缺點(diǎn)是出錯(cuò)時(shí)很難定位到是哪寫(xiě)錯(cuò)了,而且與其他模板引擎相比,功能確實(shí)少了點(diǎn)(不過(guò)我還沒(méi)遇到不夠用的情況)。
另外,{% raw ... %} 寫(xiě)起來(lái)好麻煩。None 在輸出時(shí)會(huì)顯示成 None,而不是空字符串,導(dǎo)致寫(xiě)起來(lái)很累。
它輸出的 HTML 代碼是去掉頭尾空格的,不過(guò)單獨(dú)的 Python 代碼行會(huì)顯示成空行,看上去比較怪。
@Jinja2 的優(yōu)點(diǎn)是功能多,定義了很多輔助函數(shù),有 filter,也有內(nèi)聯(lián)的 if 表達(dá)式這種語(yǔ)法糖,寫(xiě)起來(lái)比較舒服。此外,它能夠調(diào)整空白,這使得它輸出的 HTML 比較好看。
缺點(diǎn)是學(xué)習(xí)成本較高,語(yǔ)法也不是純 Python 了,甚至不能 import Python 模塊和使用 [item for item in list if item] 這種列表解析表達(dá)式。
另一個(gè)嚴(yán)重的缺點(diǎn)是不能輸出非 ASCII 的字符串, 遇到這種情況必須使用 unicode 類型,但要保證這點(diǎn)很麻煩。
@Mako 的優(yōu)點(diǎn)是和 pyTenjin 一樣可以寫(xiě)任意 Python 代碼,又和 Jinja2 一樣支持 filter(其實(shí)習(xí)慣了函數(shù)調(diào)用的話)。
缺點(diǎn)也是學(xué)習(xí)成本較高,語(yǔ)法比較復(fù)雜,對(duì) HTML 編輯器不友好。
@PyJade 的優(yōu)點(diǎn)是寫(xiě)起來(lái)最快(特別是對(duì)前端而言),沒(méi)什么多余的東西。
缺點(diǎn)和 Jinja2 一樣,更慘的是它幾乎沒(méi)有文檔,而且最新的 release 版不可用,需要用開(kāi)發(fā)版。
目前看來(lái),我還是繼續(xù)用 pyTenjin 算了,其他的要么不好用,要么學(xué)習(xí)成本比較高,而且多出來(lái)的功能感覺(jué)并不是非有不可的。
相關(guān)文章
python編程簡(jiǎn)單幾行代碼實(shí)現(xiàn)視頻轉(zhuǎn)換Gif示例
這篇文章主要為大家介紹了簡(jiǎn)單使用幾行python代碼就可以實(shí)現(xiàn)將視頻轉(zhuǎn)換Gif的示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10Python爬蟲(chóng)圖片懶加載技術(shù) selenium和PhantomJS解析
這篇文章主要介紹了Python爬蟲(chóng)圖片懶加載技術(shù) selenium和PhantomJS解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09python連接mongodb數(shù)據(jù)庫(kù)操作數(shù)據(jù)示例
這篇文章主要介紹了python連接mongodb操作數(shù)據(jù)示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-11-11一文讓你秒懂精通pip并快速體驗(yàn)深度學(xué)習(xí)應(yīng)用【建議收藏】
在使用python的時(shí)候,經(jīng)常使用到pip這個(gè)工具,可以很方便的線上安裝依賴庫(kù),當(dāng)然pip還有很多參數(shù)都可以幫我們?nèi)ゲ樵円恍?kù)信息,這篇文章主要給大家介紹了如何通過(guò)一篇文章讓你秒懂精通pip并快速體驗(yàn)深度學(xué)習(xí)應(yīng)用的相關(guān)資料,需要的朋友可以參考下2021-08-08Python實(shí)現(xiàn)接口自動(dòng)化封裝導(dǎo)出excel和讀寫(xiě)excel數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)接口自動(dòng)化封裝導(dǎo)出excel和讀寫(xiě)excel數(shù)據(jù),文中的示例代碼簡(jiǎn)潔易懂,希望對(duì)大家有所幫助2023-07-07Python 使用 environs 庫(kù)定義環(huán)境變量的方法
這篇文章主要介紹了Python 使用 environs 庫(kù)來(lái)更好地定義環(huán)境變量,本節(jié)我們以 Python 項(xiàng)目為例,說(shuō)說(shuō)環(huán)境變量的設(shè)置。通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02終端能到import模塊 解決jupyter notebook無(wú)法導(dǎo)入的問(wèn)題
這篇文章主要介紹了在終端能到import模塊 而在jupyter notebook無(wú)法導(dǎo)入的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03使用python和opencv的mask實(shí)現(xiàn)摳圖疊加
這篇文章主要介紹了使用python和opencv的mask實(shí)現(xiàn)摳圖疊加操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04