在Flask(flask.g)中使用全局变量

2024-10-01 13:43:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在服务器上启动一个数据加载过程,这将需要10-15分钟。 当这个进程正在运行时,我想对服务器进行连续的ajax调用,以告诉用户数据加载过程在哪里。在

我的一切都在工作;数据加载、ajax等等……但是我可以来回传递状态。我使用全局g变量如下:

此函数最初由客户端调用。同时,客户机启动5秒轮询(我用一个简单的时间循环替换了一些代码,使thinkes变得简单):

@app.route('/updatedb')
def updatedb():
    while True:
        g.songcounter = time.strftime("%I:%M:%S")
        print(g.songcounter)
        time.sleep(1)
    models.add_collection("/media/store/Music")
    return 

这是客户端每5秒调用一次:

^{pr2}$

…这就是我得到的。g.songcounter在更新线程之外无效。。。 这也许很公平…但我该怎么办?在

127.0.0.1 - - [17/Jun/2014 07:41:31] "GET /dbstatus HTTP/1.1" 500 -
07:41:31
07:41:32
127.0.0.1 - - [17/Jun/2014 07:41:33] "GET /dbstatus HTTP/1.1" 500 -
07:41:33
127.0.0.1 - - [17/Jun/2014 07:41:34] "GET /dbstatus HTTP/1.1" 500 -
07:41:34
07:41:35
127.0.0.1 - - [17/Jun/2014 07:41:36] "GET /dbstatus HTTP/1.1" 500 -
07:41:36
07:41:37
127.0.0.1 - - [17/Jun/2014 07:41:38] "GET /dbstatus HTTP/1.1" 500 -
07:41:38
127.0.0.1 - - [17/Jun/2014 07:41:39] "GET /dbstatus HTTP/1.1" 500 -
07:41:39

Tags: 数据用户服务器http客户端gettime进程
1条回答
网友
1楼 · 发布于 2024-10-01 13:43:56

不能将上下文对象作为g来处理。上下文对象只对一个线程有效,并且在进入或退出后发生了更改(例如开始请求或结束请求)。有关详细信息,您可以阅读http://flask.pocoo.org/docs/appcontext/http://flask.pocoo.org/docs/reqcontext/或另一个有趣的问题What is the purpose of Flask's context stacks?。在

因此,您最好使用另一个共享存储用户/会话id作为密钥:

  • 全局dict
  • 服务器端会话
  • 缓存/redis/memcachehd
  • 数据库
  • 等等

相关问题 更多 >