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访问和操作全局变量?
Python全局变量就像counter在操作系统进程内存空间中一样.每个启动和停止的进程(应用程序,命令等)都有自己的内存块.
运行时python counter.py reset,启动一个具有自己的内存空间和变量的新进程.变量reset是针对此进程运行的,而不是运行Web服务器的进程.
要正确重置变量
保持变量超出进程内存空间(例如,在memcached中,数据库)
使用wget,curl,urllib等创建一个通过特殊视图URL调用Web服务器进程的命令,此视图重置进程内存空间内的变量
| 归档时间: |
|
| 查看次数: |
2976 次 |
| 最近记录: |