gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:55:02 25 4
gpt4 key购买 nike

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

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

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

但是,当我尝试使用 flask-script 扩展提供的管理界面从命令行调用重置方法时,全局计数器变量未重置:

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

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

最佳答案

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

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

正确重置变量

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

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

关于python - 在基于 Flask 的 Python Web 应用程序中从外部更改全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16055024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com