2016-12-14 7 views
7

मैंने .js फ़ाइलों में से एक पर परिवर्तन किया है जो मैं उपयोग करता हूं और इससे कोई फर्क नहीं पड़ता कि फ्लास्क मेमोरी कैश से, फ़ाइल के अंतिम संस्करण के बिना, उठाए जाने पर जोर देता है बदलाव।फ्लास्क .js फ़ाइल में परिवर्तन नहीं देखता

स्पष्टीकरण के लिए, मेरे पास निम्न संरचना है। यह सब foo.html

return render_template foo.html 

foo.html साथ एक फार्म के अंदर जो कुछ डेटा के साथ कुप्पी कॉल है शुरू होता है और फिर एक दूसरा टेम्पलेट bar.html रिटर्न:

return render_template bar.html 

यह दूसरा टेम्पलेट कुछ .js फ़ाइल कहता है, static में रखा फ़ोल्डर, लेकिन जब कोड बदलता है तो यह अद्यतन नहीं होता है।

मैं ऊपर क्योंकि अगर .js फ़ाइल foo.html बजाय bar.html पर रखा गया था संरचना का उल्लेख तो बोतल फ़ाइल पर नए परिवर्तन लेने जाएगा। लेकिन bar.html में फ्लास्क पूरी तरह से उन्हें अनदेखा करता है।

क्या हो रहा है?

ब्राउज़र पर "अक्षम कैश" पर क्लिक करने और फिर से लोड करने के लिए काम करने वाली एकमात्र चीज थी।

+0

यदि आप जेएस फ़ाइल दिखाने के लिए ब्राउज़र में बदलाव करने में सक्षम हैं, तो समस्या शायद सर्वर पर नहीं है। – cwallenpoole

+0

यह फ्लास्क के साथ समस्या नहीं है लेकिन ब्राउज़र तेजी से काम करने के लिए कैश में पुराना संस्करण रखता है। आम तौर पर आप स्थिर .js के साथ काम करेंगे और इससे कोई समस्या नहीं है। कुछ सर्वर नए संस्करण को लोड करने के लिए ब्राउज़र को मजबूर करने के लिए स्क्रिप्ट के लिए गतिशील यूआरएल का उपयोग करते हैं - यानी। '" script.js? some_variable = dynamic_value "'। 'dynamic_value' संस्करण संख्या या फ़ाइल की तारीख हो सकती है। – furas

+0

लेकिन मैं ब्राउजर को कैश किए गए संस्करण का उपयोग कैसे नहीं कर सकता? इसके अलावा, दूसरा मामला तब ठीक क्यों काम करता है? – elelias

उत्तर

15

अंत में यह एक निराशा होती ब्राउज़र कैश मुद्दा है, एक "हार्ड ताज़ा" है, जो एक ब्राउज़र/OS निर्भर कीस्ट्रोक होने जा रहा है ऐसा करने के लिए ब्राउज़र के लिए मजबूर द्वारा हल किया जा सकता है, लेकिन आम तौर पर यह काम करता है:

  • विंडोज: Ctrl + F5
  • मैक: Cmd + Shift + R
  • लिनक्स: Ctrl + Shift + आर

अन्य फ़ाइल नाम चाल को इस समस्या का (की टिप्पणियों में उल्लेख किया है से बचने के लिए उपयोग कर सकते हैं कर रहे हैंओ पी)। ये उत्पादन में विशेष रूप से महत्वपूर्ण हैं जहां ब्राउज़र व्यवहार पर आपका कोई नियंत्रण नहीं है।

गैर-स्टेटिक फ्लास्क प्रतिक्रियाओं के लिए आप cache_control.max_age संपत्ति सेट कर सकते हैं, जिसे कैश किया गया है, तो प्रतिक्रिया को समाप्त करने के लिए ब्राउज़र को बताना चाहिए। उदाहरण के लिए यदि आप एक बोतल एक्सएचआर endpoint कि JSON डेटा आप ऐसा कर सकता है देता है अगर:

@app.route('/_get_ajax_data/') 
def get_ajax_data(): 
    data = {"hello": "world"} 
    response = jsonify(data) 
    response.cache_control.max_age = 60 * 60 * 24 # 1 day (in seconds) 
    return response 

आप आमतौर पर भी विशिष्ट संसाधन प्रकार के लिए अपने उत्पादन वेब सर्वर विन्यास में मूलभूत मूल्यों सेट कर सकते हैं (उदाहरण के लिए सीएसएस/जे एस/एचटीएमएल/JSON/आदि)

1

आप (इस आम तौर पर एक विकास के वातावरण में होता है), तो आप SEND_FILE_MAX_AGE_DEFAULT configuration value स्थापित करने के लिए आवश्यकता हो सकती है बोतल के साथ अपने स्थिर संपत्ति की सेवा कर रहे हैं: करने के लिए

डिफ़ॉल्ट कैश नियंत्रण अधिकतम आयु send_static_file() (डिफ़ॉल्ट सेंट के साथ उपयोग करें एटिक फ़ाइल हैंडलर) और send_file(), datetime.timedelta या सेकंड के रूप में। इस मूल्य को क्रमशः फ्लास्क या ब्लूप्रिंट पर get_send_file_max_age() हुक का उपयोग करके प्रति-फ़ाइल आधार पर ओवरराइड करें। 43200 (12 घंटे) के लिए डिफ़ॉल्ट।

इस सुलझाने तो जैसे app.config शब्दकोश को अद्यतन करने, के रूप में के रूप में आसान हो सकता है:

app = Flask(__name__) 
... 
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 

आप ऐसा करते हैं, तो आपके ब्राउज़र स्थिर संपत्ति है कि बोतल से सेवा कर रहे हैं कैश नहीं होंगे।

+0

जो वास्तव में जानना उपयोगी है, धन्यवाद। – elelias

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