2013-04-17 3 views
6

Ich verstehe nicht, wie Sie eine globale Variable ändern, wenn Sie das flaschen-extension-flask-script verwenden. Um mein Problem zu demonstrieren, entwickelte ich die folgende kleine Kolben-Anwendung, die eine globale Zählervariable für jeden Anfrageanruf erhöht. Darüber hinaus bietet es eine Reset-Funktion den globalen Zähler zurücksetzen:Ändern einer globalen Variablen von außen in einer Flask-basierten Python-Webanwendung

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

ich meine Kolben-Anwendung starten python counter.py runserver

Verwendung Wenn ich die Adresse zugreifen 127.0.0.1:5000 ich den Zähler sehen zunehmende

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 
... 

Wenn ich die Adresse zugreifen 127.0.0.1:5000/reset ich, dass der Zähler siehe zurückgesetzt

ist
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 - 

aber wenn ich versuche, die Reset-Methode von der Kommandozeile rufen Sie die Schnittstelle durch den Kolben-Skript Erweiterung der globale Zählervariable zurückgesetzt wird, nicht zur Verfügung gestellt verwalten mit:

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

Was mache ich falsch? Wie kann ich eine globale Variable mit flask-script aufrufen und bearbeiten?

Antwort

7

Python globale Variablen wie counter leben im Betriebssystem Prozessspeicherplatz. Jeder gestartete und gestoppte Prozess (Anwendung, Befehl usw.) erhält seinen eigenen Speicher.

Wenn Sie python counter.py reset ausführen, wird ein neuer Prozess mit eigenem Speicherplatz und Variablen gestartet. Der variable Reset wird für diesen Prozess ausgeführt, nicht für den Prozess, auf dem der Webserver ausgeführt wird.

So setzen Sie die Variable korrekt

  • Variable Außerhalb der Prozessspeicherbereich (zB in Memcached, Datenbank)

  • einen Befehl erstellen, die den Web-Server-Prozess über eine spezielle Ansicht URL ruft mit wget, curl, urllib oder so und diese Ansicht setzt die Variable innerhalb des Prozessspeicherraums zurück

+0

So gibt es keinen einfachen Weg (ohne DB, Memcache), um mein Beispiel zu beheben? – asmaier

+0

Nein, leider funktionieren Computer so –