2015-12-03 22 views
14

Ho alcuni problemi di memorizzazione nella cache. Sto eseguendo un'applicazione web molto piccola che legge un frame, lo salva sul disco e poi lo mostra nella finestra dei browser.Disabilitare la memorizzazione nella cache nel pallone

Lo so, probabilmente non è la soluzione migliore, ma ogni volta che salvo questo fotogramma di lettura con lo stesso nome e quindi qualsiasi browser lo memorizzerà nella cache.

ho provato ad usare html meta-tag - senza successo:

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

Inoltre, ho provato questo (specifica in pallone):

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

Ecco come ho cercato di modificare resp intestazioni:

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" 

Ancora sia Google Chrome e Safari fare il caching.

Quale potrebbe essere il problema qui?

Grazie in anticipo

risposta

21

OK,

finalmente ha funzionato con questo:

@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 

Se si aggiunge questo, questa funzione sarà chiamato dopo ogni richiesta fatta. Per favore, vedi here

Sarei felice, se qualcuno potesse spiegarmi perché queste intestazioni di sovrascrittura non funzionavano dal gestore di pagine?

Grazie.

+0

Hai detto al browser di non memorizzare nella cache la risposta contenente il contenuto di video.html. Devi dirgli di non memorizzare nella cache la risposta contenente il frame stesso. – dirn

+6

Nota che stai sovrascrivendo 'r.headers [" Cache-Control "]' dalla prima riga nella penultima riga. Così efficacemente la tua risposta avrà solo l'impostazione "public, max-age = 0" per 'Cache-Control' –

1

Ho trovato this post from Flask creator Armin Ronacher che mi ha impostato sulla traccia corretta, ma lo snippet fornito non funzionava per tutte le versioni di Internet Explorer che stavamo prendendo di mira. Tuttavia, sono stato in grado di frusta insieme un decoratore che ha fatto:

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) 

per invocarlo, tutto quello che dovete fare è importare la funzione e applicarlo al vostro punto finale.

from nocache import nocache 

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