2015-10-06 26 views
7

Ich folgte einem tutorial Flask-Cache und versuchte es selbst zu implementieren. Gegeben das folgende Beispiel, warum sollte Flask die Zeit nicht zwischenspeichern?Flask Cache nicht im Cache

from flask import Flask 
import time 

app = Flask(__name__) 
cache = Cache(config={'CACHE_TYPE': 'simple'}) 
cache.init_app(app) 

@app.route('/time') 
@cache.cached(timeout=50, key_prefix='test') 
def test(): 
    return time.ctime() 

Ausgabe ist immer die aktuelle Zeit.

Es scheint, als ob der Cache jede einzelne Anforderung neu erstellt wird. Was mache ich falsch?

Edit: Ich führen Sie das folgende Python-Datei mit Python 2.7.6:

def runserver(): 
    port = int(os.environ.get('PORT', 5000)) 
    Triangle(app) 
    app.run(host='0.0.0.0', port=port, processes=5) 


if __name__ == '__main__': 
    runserver() 
+0

Ich kann dies nicht reproduzieren; Beim Ausführen mit Flask mit dem mitgelieferten 'app.run()' -Entwicklungsserver wird die Zeit zwischengespeichert. Wie läuft es dir? –

+0

Beachten Sie, dass 'SimpleCache' ein * globales Wörterbuch * ist. Wenn Sie einen WSGI-Server verwenden, der Multiprocessing zum Skalieren verwendet, erhalten Sie separate Kopien, die scheinbar nicht zwischengespeichert werden. –

+0

Danke Martijn, ich benutze es lokal und stelle es nicht auf irgendeinem wsgi-Server bereit. Ich habe mein Skript hinzugefügt – Frame91

Antwort

14

Sie verwenden die SimpleCache Setup:

cache = Cache(config={'CACHE_TYPE': 'simple'}) 

Dieses verwendet einen einzigen globalen Wörterbuch den Cache zu halten Dies funktioniert nur, wenn Sie einen WSGI-Server verwenden, der einen Python-Interpreter verwendet, um alle Ihre WSGI-Anforderungen zu bedienen. Wenn Sie einen WSGI-Server verwenden, der separate untergeordnete Prozesse zum Verarbeiten von Anforderungen verwendet, erhalten Sie jedes Mal eine neue Kopie dieses Wörterbuchs, und es wird effektiv nichts zwischengespeichert.

Der Code funktioniert einwandfrei, wenn er mit dem integrierten Entwicklungsserver app.run() ausgeführt wird, vorausgesetzt, Sie verwenden das Argument processes nicht.

Ihr Update zeigt, dass Sie den Server mit separaten Prozessen ausführen. Jeder Prozess erhält sein eigenes Wörterbuch, und der Cache wird nicht zwischen ihnen geteilt. Verwenden Sie stattdessen ein anderes Caching-Backend, z. B. filesystem:

cache = Cache(config={'CACHE_TYPE': 'filesystem', 'CACHE_DIR': '/tmp'}) 
+0

Sie haben Recht! Was muss ich ändern, wenn ich das Prozessargument beibehalten möchte? – Frame91

+0

Verwenden Sie ein anderes Back-End, das von Prozessen gemeinsam genutzt werden kann. Das 'Dateisystem' ist eines, das keine zusätzlichen Abhängigkeiten erfordert. –

+1

Vielen Dank für die perfekte Antwort! Ich hätte es nicht selbst herausgefunden! – Frame91