flas中每个客户端请求的单独数据

2024-10-01 05:00:58 发布

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

我已经创建了一个flask应用程序,它打开数据库连接并在全局变量中存储一些数据。这些全局变量中的数据由页面中的后续ajax请求使用。然而,我遇到了并发性的严重问题。我尝试同时使用uwsgi和gunicorn来运行flask应用程序(两个都得到了相同的结果)。这是我在两次运行中的配置

1)4名工人

2)多线程=在烧瓶中为真。在

当两个用户使用应用程序时(返回的数据特定于用户输入的几个选项),发生的情况是,有时来自另一个用户请求的数据进入我的应用程序实例,有时则相反。

我的假设是,我的应用程序从中获取数据的工作人员在不断变化。我不太确定古尼科恩和乌兹基的工人模式。有人能告诉我如何确保用户只得到他请求的数据吗?(提醒:他请求的数据存储在python中的一个全局变量中,在ajax请求时,这个对象被传递到html)。任何帮助都将非常感谢。在

我读过关于请求上下文的文章,但完全不知道该怎么做

@app.route("/"):
def redir():
    global a;
    #assume this is only for post(from a ajax call)
    a = #some data built from a database based on the options from the page where the post was made
    return jsondumps({'data':a[0:100]});

@app.route("/next100")
def next100():
    global a;
    # return the next 100 records of the global variable a.
    return jsondumps({'data':a[100:200]});

预期的情况是,用户向redir()函数发出第一个ajax请求,然后在另一个ajax调用中调用next100()并返回数据。 当只有一个用户时,上述操作没有任何问题。在

当有两个用户同时调用redir()和继续调用next100()时,两个用户都随机从全局“a”变量中获取数据(有时来自user1的上下文,有时来自user2的上下文)


Tags: the数据用户from应用程序flaskdatareturn
2条回答

如果要在webworker中以全局形式存储某些内容,最好确保该变量的生命周期以一个请求开始和结束。在

否则,你得到的是你从一个请求中存储了一些东西,然后另一个请求可能有一个不同的上下文(例如,不同的用户),然后你的数据就全混在一起了。在

如果某些东西需要在您的web工作者之间共享,那么最好使用一个集中的数据存储(DB、cache等),因为这样您将被迫思考并用上下文标记每个数据段。E、 g.在存储任何与用户相关的数据之前,您将考虑用user_id=X标记该行数据

您可能认为您可以使用附加了用户信息的Flask global来实现相同的功能,但是当您考虑一个请求如何发送到Web Worker 1,然后来自同一用户的另一个请求转到Web Worker 2,其中先前的数据不存在(全局仅限于webworker 1)。这是一个集中的数据存储的例子。在

正如bakkal指出的,当使用线程时,全局变量将中断。在

相反,您可以为用户提供一个cookie,其中包含您要结转的数据:

session["a"] = "a" # or whatever

当然,这不会无限扩展,因此您应该在cookie中存储一些(数据库)会话信息,并从数据库加载信息(如果您有大量数据)。在

有关烧瓶.会话读the documentation。在

实际上,flask.g是将单个请求中的信息传递给不同的函数,而不是在一个会话中从不同的请求传递到另一个请求。在

相关问题 更多 >