在基于Flask的Python Web应用程序中从外部更改全局变量

asm*_*ier 6 python global-variables flask

我不明白在使用flask扩展名flask-script时如何更改全局变量.为了演示我的问题,我开发了以下小瓶应用程序,它将为每个请求调用增加一个全局计数器变量.此外,它还提供重置功能来重置全局计数器:

# -*- 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()       
Run Code Online (Sandbox Code Playgroud)

我开始使用烧瓶应用程序 python counter.py runserver

当我访问地址127.0.0.1:5000时,我看到计数器增加了

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
...
Run Code Online (Sandbox Code Playgroud)

当我访问地址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 -
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用flask-script扩展提供的manage接口从命令行调用reset方法时,不会重置全局计数器变量:

> python counter.py reset
Counter before reset: 0
Counter after reset: 0
0
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何使用flask-script访问和操作全局变量?

Mik*_*maa 7

Python全局变量就像counter在操作系统进程内存空间中一样.每个启动和停止的进程(应用程序,命令等)都有自己的内存块.

运行时python counter.py reset,启动一个具有自己的内存空间和变量的新进程.变量reset是针对此进程运行的,而不是运行Web服务器的进程.

要正确重置变量

  • 保持变量超出进程内存空间(例如,在memcached中,数据库)

  • 使用wget,curl,urllib等创建一个通过特殊视图URL调用Web服务器进程的命令,此视图重置进程内存空间内的变量