2010-05-14 66 views
4

最近我需要生成一個巨大的HTML頁面,其中包含一個包含數千行表的報表。顯然,我不想在內存中構建整個HTML(或底層樹)。因此,我使用舊的良好字符串插值構建了頁面,但我不喜歡該解決方案。巨大的HTML/XML的Python模板

因此,我想知道是否有Python模板引擎可以按部分生成結果頁面內容。

UPD 1:我不想列出所有可用的框架和模板引擎。 我對模板解決方案很感興趣,我可以從任何框架中單獨使用模板解決方案,並且可以按部分生成內容,而不是在內存中生成整個結果。

我瞭解部分內容加載與客戶端腳本的可用性增強,但這超出了我當前問題的範圍。說,我想要生成一個巨大的HTML/XML並將其流入本地文件。

+1

我使用這個http://www.cheetahtemplate.org/ – Anycorn 2010-05-18 13:39:33

+0

@aaa:我最近瀏覽了Cheetah文檔,並考慮過它,但沒有注意到一個例子。 Mako似乎也可以寫入一個文件。 – newtover 2010-05-18 14:05:21

+0

你好。我不太瞭解makeo,只使用獵豹來生成大型C++文件。獵豹文件是徹底的,但我不記得看到完整的例子。相反,我通過將文檔中的每個片段應用到我的問題中來了解它。 – Anycorn 2010-05-18 17:57:58

回答

2

它會更方便用戶使用(假設他們已啓用javascript)以通過使用JavaScript構建表。一個jQuery插件,允許您向下滾動時自動加載內容。然後,只有幾行被加載,當用戶向下滾動更多行時,按需加載。

如果這不是解決方案,可以使用三個模板:一個用於行之前的所有內容,一個用於行之後的所有內容,第三個用於行。 然後,您首先發送before-rows模板,然後生成行並立即發送它們,然後發送行後模板。那麼你將在內存中只有一個塊/行而不是整個表。

+0

好吧,謝謝你的建議,但是這個不幸的是不回答這個問題。 – newtover 2010-05-14 09:16:26

0

您是否在使用Web框架? http://www.pylonshq.com包含與多個模板引擎的兼容性。 http://www.djangoproject.com/ Django有自己的模板語言。

我認爲一個答案,包括與JavaScript的行懶惰加載將工作的Web視圖,但我認爲該報告將需要打印,在這種情況下,你將不得不建立在一些點,對吧?

+0

對不起,我更新了我的問題。 – newtover 2010-05-18 11:34:05

+0

如果您閱讀了pylons網站,則可以查看幾種獨立於框架存在的模板語言。 – UberAlex 2010-05-18 11:41:15

2

在內存中構建這樣的東西沒有問題。幾個thounsand行是不是很大。

爲了您的模板需要你可以使用任何的:

sometools允許從這些標記語言生成HTML。

+0

謝謝。我會同意,在我的情況下,10000不是很大(取決於內容),但是如果我從MySQL獲取數據,則大小可能會增加一倍。無論如何,您的建議是以中間格式生成數據,然後使用列出的工具之一應用轉換,不是嗎?我注意到,有些解決方案甚至不是基於Python的。 – newtover 2010-05-18 14:12:28

+0

是的,像RST這樣的東西可以比HTML更簡潔地生成。這只是一個調用第三方工具將其轉換爲html的問題。我相信我提供的所有例子都有一個python庫。中間格式的另一個優點是,您可以輕鬆創建其他應用程序,如:XML表示,甚至可以將其公開爲某種類型的API(但這不是重點)。 – drozzy 2010-05-18 14:25:52

+0

關於加倍數據庫查詢的大小 - 您可以輕鬆地在內存中容納多於20k條記錄。如果你不能這樣做 - 你可以把它寫入一個文件(以中間或csv表示),然後將其轉換爲html,xml或其他任何文件。 最慢的部分將是數據庫查詢(加上網絡滯後,如果有的話),所以我不會擔心寫入/讀取到文件+轉換過程。我建議用100萬左右的行文件進行一些測試,通過將它們從RST轉換爲諸如Sphinx之類的HTML。 – drozzy 2010-05-18 14:32:38

1

你不需要流模板引擎 - 我做這一切的時候,過不了多久你遇到任何隱約沉重的服務器端,瀏覽器將開始窒息。渲染一個10000行的表格會在幾乎任何瀏覽器中掛住CPU幾秒鐘;滾動它會在Chrome瀏覽器中變得煩人,並且瀏覽器的使用率會隨着瀏覽器的增加而上升。

你可以做什麼(以前我已經實現過,儘管回顧過去並不需要)使用客戶端xslt。使用字符串打印xslt處理指令和打開和關閉標記非常簡單且相當安全;那麼你可以使用你喜歡的任何xml編寫器技術,將每一行作爲獨立的xml元素進行流式處理。

但是 - 你真的不需要這個,而且可能永遠不會 - 如果你的html生成器變得太慢,瀏覽器會有更大的問題。

所以,除非你以此爲基準並確定你確實有問題,否則不要浪費你的時間。如果你確實有問題,你可以在不根本改變方法的情況下解決它 - 在內存生成中可以正常工作。

+0

這是一個很好的評論,因爲這個問題對我來說更具理論性。實際上,我實際上會返回一個大型的HTML表格,這個表格恰好是一個有效的XML,並且可以輕鬆用於自動化。在我的情況下,我會使用寫入文件的XML編寫器,但是Python的std庫中沒有人。我沒有想到瀏覽器端的問題。謝謝。 – newtover 2010-05-24 14:54:11