2013-04-17 13 views
6

フラスコ拡張フラスコスクリプトを使用するときにグローバル変数を変更する方法がわかりません。私の問題を実証するために、私は以下の小さなフラスコアプリケーションを開発しました。これは、すべてのリクエストコールに対してグローバルカウンタ変数を増加させます。それに加えて、グローバルカウンタをリセットするリセット機能を提供しています:私はアドレス127.0.0.1:5000にアクセスすると、私は増加するカウンタを参照してくださいFlaskベースのPython Webアプリケーションでグローバル変数を外部から変更する

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

私はpython counter.py runserver

を使用して、私のフラスコのアプリケーションを起動し

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 
... 
私はカウンターがあることがわかり127.0.0.1:5000/resetアドレスにアクセスすると

リセット

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 - 
私はフラスコ-スクリプトの拡張子が提供する管理インターフェースを使用して、コマンドラインからのリセットメソッドを呼び出すしようとすると、

しかし、グローバルカウンタ変数はリセットされません。

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

を私が間違っているのか?フラスコスクリプトを使用してグローバル変数にアクセスして操作するにはどうすればよいですか?

答えて

7

counterのようなPythonグローバル変数は、オペレーティングシステムのプロセスメモリ空間に存在します。開始され、停止された各プロセス(アプリケーション、コマンドなど)は、それぞれ独自のメモリを取得します。

python counter.py resetを実行すると、独自のメモリスペースと変数で新しいプロセスが開始されます。変数resetは、Webサーバーを実行しているプロセスではなく、このプロセスに対して実行されます。

は、正しく使用して特別なビューのURLを経由してWebサーバ・プロセスを呼び出すコマンドを作成

  • はプロセスのメモリ空間から変数をキープ変数(memcachedの中で例えば、データベース)

  • をリセットするにはwget、curl、urllibなどがあり、このビューはプロセスメモリ空間内の変数をリセットします

+0

私の例を修正する簡単な方法はありません(DB、memcacheなし)。 – asmaier

+0

いいえ、残念ながらそれはコンピュータの仕組みです –

関連する問題