Tornado模板引擎一直有一個坑,有時候你可能覺得并不影響正常使用,但強迫癥就是受不了:模板會去掉每行前后的空格。
最后出來的頁面就是這樣:
不縮進真的很影響心情的好吧,特別是對一個python開發者。
國外一些Q&A對這個情況也有一些討論,其中提到比較多的就是compress_whitespace。在github找到一個issue:https://github.com/tornadoweb/tornado/issues/178,就是在抱怨空白字符的問題??瞻鬃址?lt;pre>中被去除,導致代碼標簽“<pre>”這塊出問題。
我們看看tornado代碼吧,這是Template類的構造函數:
復制代碼 代碼如下: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")其中有個compress_whitespace參數,當name(模板地址)是以.html或.js結尾的時候,將compress_whitespace為真。
實際上最后在generate函數里,處理空格的代碼:
復制代碼 代碼如下:
if writer.compress_whitespace and "<pre>" not in value: value = re.sub(r"([/t ]+)", " ", value) value = re.sub(r"(/s*/n/s*)", "/n", value)當compress_whitespace為真,且html里沒有"<pre>"的時候進入這個if語句。"<pre>"這個我估計就是解決上面那個issue用的,但明顯是一個非常不pythonic的方式。
經過一番分析,可以發現,有這樣一些方法可以避免“縮進”被去除:
1.Template的構造函數中,傳入compress_whitespace=False。
2.在模板中加入"<pre>"。3.模板文件不為.html或.js后綴,可以為.htm或.tpl等。4.修改核心庫代碼。第2種方法肯定是最爛的,不可能為了縮進問題去改模板。第3種方法只能算一個權衡之計,去避免麻煩而不是解決麻煩,不是我的風格,而且后綴改了往往影響編輯器里的代碼高亮和代碼補全。第1種方法應該是最好的,但實際上,我們在controller里調用模板是使用render()或render_string()來做的,而這兩個函數是封裝了Template對象的創建過程,我們根本接觸不到Template的構造函數,所以也沒法控制compress_whitespace的值。
所以希望官方能進行修改,讓代碼能pythonic。
我這里用第4種方法,直接去修改Tornado核心代碼,將這幾句注釋掉:

新聞熱點
疑難解答