在Flask应用程序中维护持久变量的最佳实践

4
我有一个Flask应用程序,其中我在服务器启动时初始化与设备的连接。换句话说,我在调用app.run的同一文件中初始化此连接。这个连接以调用此设备上的函数的形式出现,使用已建立的连接。我希望这个连接在服务器的整个生命周期内保持持久,并且最好这个对象也能在服务器的整个生命周期内保持持久。由于Flask可能会启动多个线程来处理对服务器的请求。
最佳的初始化此类对象的方式是什么?
  • 确保只初始化一次

  • 能够在多个Blueprint中访问

也许我正在寻找像Singleton这样的东西?
谢谢!
1个回答

2
如果您知道您的应用程序只会在一个进程中运行,但有多个线程(这在大多数生产WSGI服务器中可能不是情况),一种方法是将资源与threading.Lock配对,并封装在一个类中。然后通过配置向应用程序“传递”该类的一个(单独)实例。在封装类内部,保护对资源的访问。
Flask方面可能会执行以下操作:
@app.route('/something')
def something():
    app.config['RESOURCE'].action(...)
    ...

调用一个锁定资源并委派调用的方法。
def action(self, ...):
    with self.lock:
        self.resource.action(...)

用这种方式锁定将阻止其他可能需要同时访问资源的Flask线程。

有一个可以借鉴的工作示例在这里。查看control.py,忽略在单独线程中运行Flask的部分。

这在开发服务器中运行良好。如果您在uwsgi/gunicorn下部署,则所有赌注都取消。


谢谢,这看起来就是我想要的。如果我使用Blueprint,那么我会失去app变量,对吗?Flask是否维护某种当前应用程序指针? - Carpetfizz
使用 from flask import current_app 解决。 - Carpetfizz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接