Tornado Web服務(wù)器中處理空白字符的解決方案
Tornado模板引擎一直有一個(gè)坑,有時(shí)候你可能覺得并不影響正常使用,但強(qiáng)迫癥就是受不了:模板會(huì)去掉每行前后的空格。
最后出來的頁面就是這樣:
不縮進(jìn)真的很影響心情的好吧,特別是對(duì)一個(gè)python開發(fā)者。
國外一些Q&A對(duì)這個(gè)情況也有一些討論,其中提到比較多的就是compress_whitespace。在github找到一個(gè)issue:https://github.com/tornadoweb/tornado/issues/178,就是在抱怨空白字符的問題??瞻鬃址?lt;pre>中被去除,導(dǎo)致代碼標(biāo)簽“<pre>”這塊出問題。
我們看看tornado代碼吧,這是Template類的構(gòu)造函數(shù):
def __init__(self, template_string, name="<string>", loader=None,
compress_whitespace=None, autoescape=_UNSET):
self.name = name
if compress_whitespace is None:
compress_whitespace = name.endswith(".html") or \
name.endswith(".js")
其中有個(gè)compress_whitespace參數(shù),當(dāng)name(模板地址)是以.html或.js結(jié)尾的時(shí)候,將compress_whitespace為真。
實(shí)際上最后在generate函數(shù)里,處理空格的代碼:
if writer.compress_whitespace and "<pre>" not in value:
value = re.sub(r"([\t ]+)", " ", value)
value = re.sub(r"(\s*\n\s*)", "\n", value)
當(dāng)compress_whitespace為真,且html里沒有"<pre>"的時(shí)候進(jìn)入這個(gè)if語句。"<pre>"這個(gè)我估計(jì)就是解決上面那個(gè)issue用的,但明顯是一個(gè)非常不pythonic的方式。
經(jīng)過一番分析,可以發(fā)現(xiàn),有這樣一些方法可以避免“縮進(jìn)”被去除:
1.Template的構(gòu)造函數(shù)中,傳入compress_whitespace=False。
2.在模板中加入"<pre>"。
3.模板文件不為.html或.js后綴,可以為.htm或.tpl等。
4.修改核心庫代碼。
第2種方法肯定是最爛的,不可能為了縮進(jìn)問題去改模板。第3種方法只能算一個(gè)權(quán)衡之計(jì),去避免麻煩而不是解決麻煩,不是我的風(fēng)格,而且后綴改了往往影響編輯器里的代碼高亮和代碼補(bǔ)全。第1種方法應(yīng)該是最好的,但實(shí)際上,我們?cè)赾ontroller里調(diào)用模板是使用render()或render_string()來做的,而這兩個(gè)函數(shù)是封裝了Template對(duì)象的創(chuàng)建過程,我們根本接觸不到Template的構(gòu)造函數(shù),所以也沒法控制compress_whitespace的值。
所以希望官方能進(jìn)行修改,讓代碼能pythonic。
我這里用第4種方法,直接去修改Tornado核心代碼,將這幾句注釋掉:
相關(guān)文章
MongoDB學(xué)習(xí)筆記(五) MongoDB文件存取操作
由于MongoDB的文檔結(jié)構(gòu)為BJSON格式(BJSON全稱:Binary JSON),而BJSON格式本身就支持保存二進(jìn)制格式的數(shù)據(jù),因此可以把文件的二進(jìn)制格式的數(shù)據(jù)直接保存到MongoDB的文檔結(jié)構(gòu)中2013-07-07Valheim服務(wù)器?Mod修改安裝教程?【ValheimPlus】
這篇文章主要介紹了Valheim服務(wù)器?Mod修改安裝?【ValheimPlus】,本教程只提供Windows版本服務(wù)器的mod安裝過程,Linux的安裝教程過程是一樣的本人懶得寫了,此mod采用c配置,需要的朋友可以參考下2022-12-12服務(wù)器維護(hù)小常識(shí)(硬盤內(nèi)容增加、數(shù)據(jù)庫優(yōu)化等)
為了能更好的使用和延長服務(wù)器的使用壽命,定期的對(duì)服務(wù)器進(jìn)行維護(hù)是非常必要的。但是,在維護(hù)服務(wù)器的時(shí)候一定要小心的處理好維護(hù)的工作,否則出現(xiàn)錯(cuò)誤的話就會(huì)影響很大2012-07-07服務(wù)器之間文件備份方案、如何把服務(wù)器文件自動(dòng)備份到另外一臺(tái)服務(wù)器?
很多單位都有文件服務(wù)器備份的需求,并且常常是把一個(gè)服務(wù)器的文件自動(dòng)備份到另外一臺(tái)文件服務(wù)器,下面就跟隨小編一起來了解一下2019-05-05DELL服務(wù)器 Dell PowerEdge服務(wù)器RAID卡驅(qū)動(dòng)大全
這篇文章主要介紹了DELL服務(wù)器 Dell PowerEdge服務(wù)器RAID卡驅(qū)動(dòng),因?yàn)楣俜降暮芏嘞到y(tǒng)都不帶陣列卡驅(qū)動(dòng),需要安裝驅(qū)動(dòng)才可以,一般情況下2003用集成raid驅(qū)動(dòng)的系統(tǒng)才可以安裝或者按F6加載驅(qū)動(dòng)2016-04-04在mac上安裝虛擬機(jī)搭載Windows服務(wù)的方法
這篇文章主要介紹了在mac上安裝虛擬機(jī)搭載Windows服務(wù)的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12git忽略特殊文件_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了git忽略特殊文件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08