2015-10-06 11 views
7

Ho seguito un tutorial di Flask-Cache e ho provato a implementarlo da solo. Dato il seguente esempio, perché Flask non memorizzerà l'ora nel cache?Flask Cache not caching

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() 

L'uscita è sempre l'ora corrente.

Sembra che la cache venga ricreata ogni singola richiesta. Che cosa sto facendo di sbagliato?

Edit: ho eseguire il seguente python-file con 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

Non riesco a riprodurre questo; quando si esegue con Flask con il server di sviluppo 'app.run()' in bundle, l'ora viene memorizzata nella cache. Come stai correndo questo? –

+0

Si noti che 'SimpleCache' è un * dizionario globale *. Se si utilizza un server WSGI che utilizza la multiprocessing per ridimensionare, si otterranno copie separate e appariranno non in cache. –

+0

Grazie Martijn, lo sto eseguendo localmente e non lo sto distribuendo su alcun server wsgi. Ho aggiunto il mio runscript – Frame91

risposta

14

Si utilizza la messa a punto SimpleCache:

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

Questo utilizza un unico dizionario globale per contenere la cache , e questo a sua volta funzionerà solo se stai usando un server WSGI che usa un interprete Python per servire tutte le tue richieste WSGI. Se si utilizza un server WSGI che utilizza processi figli separati per gestire le richieste, si otterrà una nuova copia di quel dizionario ogni volta e nulla verrà memorizzato nella cache, in modo efficace.

Il codice funziona correttamente quando viene eseguito con il server di sviluppo app.run() integrato, poiché non si utilizza l'argomento processes.

L'aggiornamento mostra che si esegue il server con processi separati. Ogni processo avrà il proprio dizionario e la cache non sarà condivisa tra loro. Utilizzare invece un diverso back-end di cache, come filesystem:

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

Hai ragione! Cosa devo cambiare se voglio mantenere l'argomento dei processi? – Frame91

+0

Utilizzare un back-end diverso, uno che può essere condiviso tra i processi. Il 'filesystem' è uno che non richiede dipendenze aggiuntive. –

+1

Grazie mille per la risposta perfetta! Non l'avrei capito da solo! – Frame91