2013-12-18 70 views
5

我們有一個自定義Jinja過濾器,我們用它爲我們的Javascript和CSS資源創建緩存清除URL。我們現在注意到,在我們的生產環境中,最終的編譯模板被緩存。這會導致一個問題,因爲我們的模板過濾器有時不會創建一個新的URL(即,當模板沒有改變,但是Javascript是)。爲某些過濾器禁用Jinja模板緩存

有沒有辦法強制Jinja每次重新評估某個過濾器而不緩存結果?

編輯1:我們使用常量輸入(文件的名稱)過濾器。

回答

2

的Jinja2的緩存行爲可以使用cache_size設置進行配置:http://jinja.pocoo.org/docs/api/#jinja2.Environment

然而,這僅僅緩存模板本身。只要過濾器的輸入是可變的,輸出也會變化。

所以...你怎麼使用過濾器?你能發佈模板的部分和正在緩存的過濾器嗎?

+1

是的,我們使用的是恆定的輸入值(我們要cachebust的文件名)。 –

+0

我有一個名爲'datetimeformat'的自定義過濾器,它格式化傳遞的日期時間。我添加了一個快捷方式,當''now'| datetimeformat'被使用,它會把當前時間。並發現它不會改變... – warvariuc

+0

@warvariuc:這取決於你如何得到''現在'。如果構建得當,它應該可以正常工作,但是很容易意外地將日期設爲靜態,從而打破所有更改。 – Wolph

3

有一種方法可以禁用特定過濾器的結果的高速緩存:它是由而不是使用恆定輸入,例如,通過將隨機源暴露爲全局變量。

# Expose to Jinja 
from random import random as RANDOM 

而且在模板

{{ RANDOM() | eval_this_filter_every_time }} 
5

經過大量的谷歌搜索,我終於找到真正的解決了這一點。 Jinja有一個名爲contextfilter的特殊幫助程序,您可以使用它來修飾您的函數,使您的過濾器上下文感知(和上下文相關)。 Jinja字節碼緩存不會緩存這個計算值,即使當一個常量作爲輸入傳遞時也是如此。

在你的過濾器在Python:

from jinja2 import contextfilter 

@contextfilter 
def asset_url(context, url): 
    return some_url_thing(url) 

在模板:

<link rel="stylesheet" href="{{ 'styles.css' | asset_url }}" /> 
+0

很多很多很多,感謝這個! –

+0

這是正確的答案 – b264