2010-11-18 43 views
3

我想在不重新啓動應用程序的情況下在django應用程序中切換Jinja2模板。如何強制Jinja2模板重新編譯?

有沒有人這樣做?基本上我需要強制jinja2在應用皮膚選擇更改後重新加載模板。

我試着在模板環境對象上重新創建緩存對象,但沒有任何效果。

myskin_utils.py:

from jinja2.environment import create_cache 
ENV_OBJECT.cache = create_cache(50) 

我也嘗試重新加載一個包含我的

reload(myskin) #also no effect on the output 

另一件事我想改變的飛行是語言ENV_OBJECT模塊,但我想這是一個單獨的問題。

感謝您的任何建議。我沒有使用jinja2設置緩存,但是我看到從Django模板切換後使用Jinja的速度提高了,我懷疑模板字節碼存在於我的視圖函數的編譯代碼中,但是我沒有研究過忍者的細節。

我有ENV(的CoffinEnvironment一個實例,其子類神社的Environment)在視圖模塊的全局命名空間的進口,並呼籲ENV.get_template()內視圖功能(Django的+棺材+ Jinja2的)。

發現,如果我叫Python的reload()內建我的環境模塊上內視圖功能模板做開關,但我不希望堅持的代碼到每一個功能。

回答

4

默認情況下,Jinja2根本不使用任何緩存,但建議配置緩存後端以稍微加快速度。因此,jinja2不必在每個請求中解析和編譯每個模板。 Jinja2目前支持兩種不同的緩存類型:

其中之一是FileSystemBytecodeCache這是(如名稱建議)文件的基礎。所以所有編譯好的模板都存儲在文件系統中並從那裏檢索。如果仔細查看實現,您還會發現一個cache.clear()方法,它只是刪除此臨時文件夾中的所有文件。導致所有模板被再次解析/編譯。

另一種緩存類型叫做MemcachedBytecodeCache,它只是Memcache的一個薄包裝。建議使用此方法,因爲Memcache將所有內容存儲在內存中,因此速度比打印磁盤快一點,並且可以使用來自不同主機的相同緩存(如果您正在運行某種羣集,此緩存很有用)。

底層Memcache客戶端(werkzeug.contrib.cache,python-memcached或cmemcache)也提供了一個clear()方法,它將刪除緩存中的所有內容。但是因爲你也可能使用緩存來處理其他事情(例如在那裏存儲昂貴的數據庫查詢的結果),所以clear()方法不會在jinja中公開,因爲它會影響一切(而不僅僅是模板)。

因此,要總結你的選擇是:

  • 使用Jinja2的無緩存
  • 使用Jinja2的一個FileSystemBytecodeCache,並呼籲cache.clear()
  • 使用Jinja2的一個MemcachedBytecodeCache並調用memcache_client.clear()(這也將明確緩存中的所有其他內容)。
  • 在另一個僅用於Jinja2的端口上運行單獨的memcached進程。然後致電memcache_client.clear()並清除所有模板。
+0

謝謝!我沒有爲Jinja2設置緩存。如果我這樣做,你認爲我會在我的環境中加快速度嗎?我的理解是,我的模板字節碼已經在內存中,對不對?再次感謝! – Evgeny 2010-11-18 17:08:30

+6

我認爲這個答案是錯誤的 - 根據[this](http://jinja.pocoo.org/docs/api/#bytecode-cache),字節碼緩存僅用於第一次運行,而不是每個請求。至於自動重新加載更改模板,有'auto_reload'選項[這裏](http://jinja.pocoo.org/docs/api/#jinja2.Environment)。不知道在2010年11月如果是相同的,這就是爲什麼我不低調這個答案。 – 2012-01-18 23:23:12

0

這是錯誤的。 Jinja默認在cache_size(環境參數)中使用內存緩存中的LRUCache。您可以使用磁盤高速緩存來重新啓動應用程序的預格式化(不需要重新編譯)。