2015-02-20 13 views
5

Ich habe eine Vorlage mit verschiedenen Einträgen, die der Autor bearbeiten/löschen kann. Benutzer können ihre Beiträge löschen, indem sie auf Löschen klickenDeaktivieren Sie den Cache auf einer bestimmten Seite mit Flask

Nach dem Löschen wird der Benutzer auf die Seite Einträge weitergeleitet, aber das Element ist immer noch da, und die Seite muss erneut geladen werden, um den Löscheffekt anzuzeigen. Wenn ich das Caching deaktivieren das Problem verschwindet, aber ich möchte wirklich Caches haben in allen anderen Seiten ...

diese Tags hinzugefügt hat nicht funktioniert, ich glaube, mein Browser sie einfach ignoriert

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

Ich aktiviere den Cache durch:

@app.after_request 
def add_header(response):  
response.headers['X-UA-Compatible'] = 'IE=Edge,chrome=1' 
response.headers['Cache-Control'] = 'public, max-age=600' 
return response 

Gibt es eine Möglichkeit, ich kann es für eine bestimmte Seite deaktivieren?

bearbeiten

wie vorgeschlagen habe ich versucht, einen Wrapper mit:

def no_cache(f): 
    def new_func(*args, **kwargs): 
     resp = make_response(f(*args, **kwargs)) 
     resp.cache_control.no_cache = True 
     return resp 
    return update_wrapper(new_func, f) 

und wickeln Sie die Seite i in einem @no_cache Dekorateur wihtout Cache wollen, immer noch kein Glück gehabt ...

Antwort

5

Sie können versuchen, Cache-Steuerheader nur hinzuzufügen, wenn für eine bestimmte Seite keine solchen Header vorhanden sind:

@app.after_request 
def add_header(response):  
    response.headers['X-UA-Compatible'] = 'IE=Edge,chrome=1' 
    if ('Cache-Control' not in response.headers): 
    response.headers['Cache-Control'] = 'public, max-age=600' 
    return response 

Und in Ihre Seite Code - z.B .:

@app.route('/page_without_cache') 
def page_without_cache(): 
    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' 
    response.headers['Pragma'] = 'no-cache' 
    return 'hello' 

Der Punkt ist, dass Sie nicht Ihre Header in @app.after_request für alle Seiten außer Kraft setzen sollte - nur für solche, bei denen Cache explizit nicht ausgeschaltet ist.

Des Weiteren sollten Sie den Code Hinzufügen von Headern zu einem Wrapper bewegen wie @no_cache - so kann man es so einfach verwenden:

@app.route('/page_without_cache') 
@no_cache 
def page_without_cache(): 
    return 'hello' 
+1

Dank für den Hinweis auf, dass ich nicht Cache-Control-Header hinzufügen Wenn sie schon da sind, habe ich nicht daran gedacht ... Ich habe versucht, wie Sie vorgeschlagen, mit einem Wrapper versuchen und versuchen, nur die Antwortheader hinzufügen, aber der Cache ist immer noch da aus irgendeinem Grund ... –

+0

@LucaBrozzi, überprüfen Sie, ob Sie die gewünschten Header in den Chrome/Mozilla-Entwicklungstools erhalten. Siehe z.B. Diese SO Antwort, wenn Sie nicht wissen, wie es geht: http://stackoverflow.com/questions/4423061/view-http-headers-in-google-chrome. Wenn Sie deutlich sehen, dass es keinen 'Cache-Control: no-cache'-Header gibt, ist es immer noch ein Problem mit überschriebenen Headern in Ihrem '@ app.after_request'-Handler. – NikitaBaksalyar

+0

ich hatte vergessen, eine Zeile zu ändern, Ihre Lösung war richtig, vielen Dank –

Verwandte Themen