2013-04-17 10 views
6

Non capisco come modificare una variabile globale quando si utilizza l'estensione flask-script del flask. Per dimostrare il mio problema ho sviluppato la seguente piccola applicazione di flacone, che aumenterà una variabile contatore globale per ogni chiamata di richiesta. Inoltre, offre una funzione di reset per ripristinare il contatore globale:Modifica di una variabile globale dall'esterno in un'applicazione Web Python basata su Flask

# -*- coding: utf-8 -*- 

import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 

from flask import Flask 
from flask.ext.script import Manager 
app = Flask(__name__) 
app.debug = True 

manager = Manager(app) 

counter = 0 

@manager.command 
@app.route("/reset") 
def reset(): 
    global counter 
    print "Counter before reset:", counter 
    counter = 0 
    print "Counter after reset:", counter 
    return str(counter) 

@app.route("/") 
def add(): 
    global counter 
    print "Counter before adding:", counter 
    counter +=1 
    print "Counter after adding:", counter 
    return str(counter) 

if __name__ == "__main__": 
    manager.run()  

comincio la mia domanda pallone usando python counter.py runserver

Quando accedo l'indirizzo 127.0.0.1:5000 vedo il contatore crescente

Counter before adding: 0 
Counter after adding: 1 
127.0.0.1 - - [17/Apr/2013 10:09:35] "GET/HTTP/1.1" 200 - 
127.0.0.1 - - [17/Apr/2013 10:09:35] "GET /favicon.ico HTTP/1.1" 404 - 
Counter before adding: 1 
Counter after adding: 2 
... 

Quando accedo l'indirizzo 127.0.0.1:5000/reset vedo che il contatore viene resettato

Counter before reset: 4 
Counter after reset: 0 
127.0.0.1 - - [17/Apr/2013 10:10:39] "GET /reset HTTP/1.1" 200 - 
127.0.0.1 - - [17/Apr/2013 10:10:39] "GET /favicon.ico HTTP/1.1" 404 - 

Tuttavia quando provo a chiamare il metodo di ripristino dalla riga di comando utilizzando l'interfaccia gestire fornita dalla estensione pallone-script la variabile contatore globale non viene azzerato:

> python counter.py reset 
Counter before reset: 0 
Counter after reset: 0 
0 

Che cosa sto facendo di sbagliato? Come posso accedere e manipolare una variabile globale usando il flag-flask?

risposta

7

Le variabili globali Python come vivono nello spazio di memoria del processo del sistema operativo. Ogni processo avviato e arrestato (applicazione, comando, ecc.) Ottiene la propria torta di memoria.

Quando si esegue python counter.py reset, viene avviato un nuovo processo con il proprio spazio di memoria e variabili. Il reset delle variabili viene eseguito su questo processo, non sul processo che esegue il server web.

Per ripristinare correttamente la variabile

  • Tenere variabile da spazio di memoria del processo (ad esempio in memcached, database)

  • Creare un comando che chiama il processo del server web tramite una vista speciale URL utilizzando wget, curl, urllib o tale e questo punto di vista ripristina la variabile all'interno dello spazio di memoria del processo

+0

Quindi non c'è un modo facile (senza DB, memcache) per risolvere il mio esempio? – asmaier

+0

No, sfortunatamente è così che funzionano i computer –