2015-12-03 21 views
14

Ich habe einige Caching-Probleme. Ich betreibe eine sehr kleine Webanwendung, die einen Frame liest, auf der Festplatte speichert und dann im Browserfenster anzeigt.Cache in Flask deaktivieren

Ich weiß, es ist wahrscheinlich nicht die beste Lösung, aber jedes Mal speichere ich diesen Leserahmen mit dem gleichen Namen und damit wird jeder Browser es zwischenspeichern.

Ich versuchte html Meta-Tags zu verwenden - ohne Erfolg:

<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" /> 

Auch habe ich dieses versucht, (Kolben spezifisch):

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

Dies ist, wie ich versuchte, resp Header ändern:

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" 

Noch sowohl Google Chrome und Safari-Caching tun.

Was könnte das Problem hier sein?

Vielen Dank im Voraus

Antwort

21

OK,

schließlich mit diesem gearbeitet:

@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 

Wenn Sie diese Erweiterung, diese Funktion aufgerufen wird nach jeder Anfrage durchgeführt. Bitte, siehe here

Ich würde mich freuen, wenn mir jemand erklären könnte, warum dieses Überschreiben der Kopfzeilen vom Seitenhandler nicht funktioniert hat?

Vielen Dank.

+0

Sie haben den Browser angewiesen, die Antwort, die den Inhalt von video.html enthält, nicht zwischenzuspeichern. Sie müssen angeben, dass die Antwort, die den Frame enthält, nicht zwischengespeichert wird. – dirn

+6

Beachten Sie, dass Sie die 'r.headers [" Cache-Control "]' aus der ersten Zeile der vorletzten Zeile überschreiben. Ihre Antwort wird also nur "public, max-age = 0" für "Cache-Control" haben –

1

Ich habe this post from Flask creator Armin Ronacher gefunden, die mich auf den richtigen Weg gebracht haben, aber das Snippet funktionierte nicht für alle Internet Explorer-Versionen, auf die wir ausgerichtet waren. Allerdings konnte ich einen Dekorateur Peitsche zusammen, das tat:

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) 

es aufzurufen, alles, was Sie tun müssen, um die Funktion importieren und an Ihren Endpunkt anzuwenden.

from nocache import nocache 

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