2015-12-03 3 views
14

में कैशिंग अक्षम करना मेरे पास कुछ कैशिंग समस्याएं हैं। मैं बहुत छोटा वेब-एप्लिकेशन चला रहा हूं जो एक फ्रेम पढ़ता है, इसे डिस्क पर सहेजता है और फिर इसे ब्राउज़र विंडो में दिखाता है।फ्लास्क

मुझे पता है, शायद यह सबसे अच्छा समाधान नहीं है, लेकिन हर बार जब मैं इस पठन फ्रेम को उसी नाम से सहेजता हूं और वहां कोई भी ब्राउज़र इसे कैश करेगा।

मैं एचटीएमएल मेटा टैग का उपयोग करने की कोशिश की है - कोई सफलता:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
<meta http-equiv="Pragma" content="no-cache" /> 
<meta http-equiv="Expires" content="0" /> 

इसके अलावा, मैं इस एक कोशिश की है (कुप्पी विशेष):

resp.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" 
resp.headers["Pragma"] = "no-cache" 
resp.headers["Expires"] = "0" 

यह कैसे मैं करने की कोशिश की है resp हेडर संशोधित:

r = make_response(render_template('video.html', video_info=video_info)) 

r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" 
r.headers["Pragma"] = "no-cache" 
r.headers["Expires"] = "0" 

फिर भी गूगल क्रोम और सफारी दोनों कैशिंग है।

यहां समस्या क्या हो सकती है?

अग्रिम धन्यवाद

उत्तर

21

ठीक है,

अंत में यह इस के साथ काम किया:

@app.after_request 
def add_header(r): 
    """ 
    Add headers to both force latest IE rendering engine or Chrome Frame, 
    and also to cache the rendered page for 10 minutes. 
    """ 
    r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" 
    r.headers["Pragma"] = "no-cache" 
    r.headers["Expires"] = "0" 
    r.headers['Cache-Control'] = 'public, max-age=0' 
    return r 

आप इस जोड़ते हैं, तो इस समारोह के बाद प्रत्येक अनुरोध किया बुलाया जाएगा। कृपया, here

मुझे खुशी होगी, अगर कोई मुझे समझा सकता है कि यह हेडर ओवरराइटिंग पृष्ठ हैंडलर से क्यों काम नहीं करती है?

धन्यवाद।

+0

आपने ब्राउज़र को बताया कि वीडियो.html की सामग्री वाले प्रतिक्रिया को कैश न करें। आपको फ्रेम को स्वयं प्रतिक्रिया देने के लिए यह बताना होगा। – dirn

+6

ध्यान दें कि आप दूसरी अंतिम पंक्ति में पहली पंक्ति से 'r.headers [" कैश-कंट्रोल "] 'ओवरराइट कर रहे हैं। तो प्रभावी रूप से आपकी प्रतिक्रिया में 'कैश-कंट्रोल' के लिए 'सार्वजनिक, अधिकतम आयु = 0' सेट होगा –

1

मुझे this post from Flask creator Armin Ronacher मिला जो मुझे सही ट्रैक पर सेट करता था, लेकिन प्रदान किया गया स्निपेट उन सभी इंटरनेट एक्सप्लोरर संस्करणों के लिए काम नहीं करता था जिन्हें हम लक्षित कर रहे थे। हालांकि, मैं एक डेकोरेटर ऐसा ही किया एक साथ कोड़ा करने में सक्षम था:

from flask import make_response 
from functools import wraps, update_wrapper 
from datetime import datetime 

def nocache(view): 
    @wraps(view) 
    def no_cache(*args, **kwargs): 
     response = make_response(view(*args, **kwargs)) 
     response.headers['Last-Modified'] = datetime.now() 
     response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0' 
     response.headers['Pragma'] = 'no-cache' 
     response.headers['Expires'] = '-1' 
     return response 

    return update_wrapper(no_cache, view) 

यह आह्वान करने के लिए, तुम सब करने की जरूरत है समारोह आयात करेगा और आपके अंतिम बिंदु पर लागू है।

from nocache import nocache 

@app.route('/my_endpoint') 
@nocache 
def my_endpoint(): 
    return render_template(...)