相关疑难解决方法(0)

烧瓶中的全局变量是否安全?如何在请求之间共享数据?

在我的应用程序中,通过发出请求来更改公共对象的状态,响应取决于状态.

class SomeObj():
    def __init__(self, param):
        self.param = param
    def query(self):
        self.param += 1
        return self.param

global_obj = SomeObj(0)

@app.route('/')
def home():
    flash(global_obj.query())
    render_template('index.html')
Run Code Online (Sandbox Code Playgroud)

如果我在我的开发服务器上运行它,我希望得到1,2,3等等.如果同时向100个不同的客户提出请求,可能出现问题吗?预期的结果是100个不同的客户端每个都看到1到100之间的唯一数字.或者会发生这样的事情:

  1. 客户端1查询.self.param增加1.
  2. 在可以执行return语句之前,线程切换到客户端2. self.param再次递增.
  3. 线程切换回客户端1,然后客户端返回数字2,比如说.
  4. 现在线程移动到客户端2并返回他/她的数字3.

由于只有两个客户端,预期结果为1和2,而不是2和3.跳过了一个数字.

当我扩展我的应用程序时,这会发生吗?我应该看一下全局变量的替代方案?

python thread-safety flask

70
推荐指数
4
解决办法
2万
查看次数

在 Python Flask 中:存储数据的合适位置是什么?

根据在flask.request上存储每个请求数据是否安全?g对象似乎是请求本地的(= 具有单个请求的生命周期)。也许我误解了这个答案,但 Flask 文档指出该g对象将是全局的,这似乎与这个答案相矛盾。

文档本身关于这些细节有点短,所以请您介意向上下文和全局对象解释细节g吗?具体解决以下问题:

  1. 为了在单个请求的生命周期内存储数据,该如何做?(使用request对象,g对象还是哪种对象?)
  2. 为了在应用程序生命周期内存储数据,应该如何做?(使用app对象,g对象还是哪种对象?)
  3. Flask 可用于多进程环境。假设在这种操作模式下会有多个应用程序范围的对象是否正确?(这意味着所有这些appg对象都需要在每个工作进程的生命周期内单独初始化。)
  4. 与问题 3 相关:如果我需要一个应用程序范围的、类似单例的对象来为 Flask Web 应用程序提供服务,是否必须将此服务分解到外部进程中?(在多进程操作模式中不会有一个类似单例的实例?)

python flask

4
推荐指数
1
解决办法
6310
查看次数

无法在视图函数中的2个烧瓶请求之间共享变量

我想要在2个烧瓶请求之间共享一个变量!该变量是一个大熊猫数据框。

我在这个答案 中已经读到,我需要使用flask global中的 g !基本上,我有2视图功能是这样的:

from flask import g
@home.route('/save', methods=['GET'])
def save_ressource():
    an_object = {'key': 'value'}
    setattr(g, 'an_object', an_object)
    return 'sucees'
@home.route('/read', methods=['GET'])
def read_ressource():
    an_object = getattr(g, 'an_object', None)
    if an_object:
        return 'sucess'
    else:
        return 'failure'
Run Code Online (Sandbox Code Playgroud)

但这总是返回失败,即:无

当我在这里阅读文档时,它说:

从Flask 0.10开始,它存储在应用程序上下文中,而不再存储在请求上下文中,这意味着只有绑定了应用程序上下文而不是请求时,它才可用

我的问题是如何解决这个问题?

如文档中所述,如何绑定应用程序上下文?

我应该改为使用会话吗?

任何帮助将不胜感激

python global flask

2
推荐指数
1
解决办法
2806
查看次数

标签 统计

flask ×3

python ×3

global ×1

thread-safety ×1