2013-12-18 8 views
5

के लिए जिनजा टेम्पलेट कैशिंग अक्षम करें हमारे पास एक कस्टम Jinja फ़िल्टर है जिसका उपयोग हम अपने जावास्क्रिप्ट और सीएसएस संसाधनों के लिए कैश बस्टिंग यूआरएल बनाने के लिए करते हैं। हमने अब देखा है कि हमारे उत्पादन वातावरण में अंतिम, संकलित टेम्पलेट कैश हो जाते हैं। इसका परिणाम किसी समस्या में होता है क्योंकि हमारे टेम्पलेट फ़िल्टर कभी-कभी एक नया यूआरएल नहीं बनाते हैं (यानी जब टेम्पलेट नहीं बदला गया था लेकिन जावास्क्रिप्ट था)।कुछ फिल्टर

क्या जिन्जा को हर बार एक निश्चित फिल्टर का पुनर्मूल्यांकन करने के लिए मजबूर करने का कोई तरीका है और परिणाम कैश नहीं करते हैं?

संपादित करें 1: हम फ़िल्टर में निरंतर इनपुट (फ़ाइल का नाम) का उपयोग कर रहे हैं।

उत्तर

2

Jinja2 की कैशिंग व्यवहार cache_size सेटिंग का उपयोग विन्यस्त किया जा सकता: http://jinja.pocoo.org/docs/api/#jinja2.Environment

हालांकि, यह केवल टेम्पलेट्स ही संचित करता है। जब तक फ़िल्टर के लिए इनपुट वैरिएबल होता है तब तक आउटपुट वैरिएबल भी होगा।

तो ... आप फ़िल्टर का उपयोग कैसे कर रहे हैं? क्या आप टेम्पलेट का हिस्सा पोस्ट कर सकते हैं और फ़िल्टर कैश हो रहा है?

+1

हाँ, हम एक निरंतर इनपुट मानों (फ़ाइल हम cachebust चाहते हैं उसका नाम) का उपयोग कर रहे हैं। –

+0

मेरे पास 'डेटाटाइमफॉर्म' नामक एक कस्टम फ़िल्टर है जो पास किए गए डेटाटाइम को प्रारूपित करता है। मैंने इसमें एक शॉर्टकट जोड़ा, कि जब 'अब' | डेटाटाइमफॉर्म 'का उपयोग किया जाता है, यह वर्तमान समय रखेगा। और पता चला कि यह नहीं बदलता है ... – warvariuc

+0

@warvariuc: यह इस बात पर निर्भर करेगा कि आप 'अब' कैसे प्राप्त करते हैं। यदि यह सही ढंग से बनाया गया है तो इसे काम करना चाहिए, लेकिन गलती से तारीख को स्थैतिक बनाना आसान है और इसलिए सभी परिवर्तनों को तोड़ना आसान है। – Wolph

3

किसी विशेष फ़िल्टर के परिणाम की कैशिंग अक्षम करने का एक तरीका है: यह निरंतर इनपुट का उपयोग करके द्वारा नहीं है, उदा। एक वैश्विक चर के रूप में यादृच्छिक स्रोत को उजागर करके।

# Expose to Jinja 
from random import random as RANDOM 

और टेम्पलेट्स

{{ RANDOM() | eval_this_filter_every_time }} 
5

Googling के बहुत सारे के बाद में, मैं अंत में यह करने के लिए वास्तविक समाधान मिल गया। जिनजा के पास contextfilter नामक एक विशेष सहायक है जिसे आप अपने फ़िल्टर को संदर्भित करने के लिए अपने फ़ंक्शन को सजाने के लिए उपयोग कर सकते हैं-जागरूक (और संदर्भ-निर्भर)। जिनजा बाइटकोड कैश इस गणना मूल्य को कैश नहीं करेगा, भले ही निरंतर इनपुट के रूप में पारित किया जाए।

अपने फिल्टर में अजगर में: अपने टेम्पलेट में

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

संबंधित मुद्दे