【问题标题】:Changing a global variable from outside in a Flask based Python web application在基于 Flask 的 Python Web 应用程序中从外部更改全局变量
【发布时间】:2013-04-17 08:19:57
【问题描述】:

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

# -*- 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 启动我的烧瓶应用程序

当我访问地址 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
...

当我访问地址 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

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

【问题讨论】:

    标签: python global-variables flask


    【解决方案1】:

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

    当您运行python counter.py reset 时,它会使用自己的内存空间和变量启动一个新进程。变量 reset 是针对这个进程运行的,而不是针对运行 Web 服务器的进程。

    正确重置变量

    • 将变量保留在进程内存空间之外(例如,在 memcached、数据库中)

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

    【讨论】:

    • 那么有没有简单的方法(没有 DB、memcache)来修复我的示例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多