【问题标题】:Best practice to maintain a persistent variable in a Flask app [duplicate]在 Flask 应用程序中维护持久变量的最佳实践 [重复]
【发布时间】:2018-12-21 01:59:11
【问题描述】:

我有一个 Flask 应用程序,用于在服务器启动时初始化与设备的连接。换句话说,我在我调用app.run 的同一个文件中初始化这个连接。此连接以对象的形式出现,该对象使用已建立的连接调用此设备上的函数。我希望此连接在服务器的整个生命周期中持续存在,理想情况下我希望此对象在服务器的整个生命周期中持续存在。因为 Flask 可能会启动多个线程来处理对服务器的请求。

在哪里以及如何初始化这样一个对象的最佳方法是

  • 只初始化一次

  • 可以多个Blueprints访问

也许我正在寻找像单身人士这样的东西?

谢谢!

【问题讨论】:

    标签: python flask


    【解决方案1】:

    如果您知道您的应用程序只能在一个具有多个线程的进程中运行(在大多数生产 WSGI 服务器中可能不是这种情况),一种方法是将资源与 threading.Lock 配对,将两者封装在一个类中。然后通过配置将该类的(单个)实例“传递”到应用程序。在封装类中,保护对资源的访问。

    Flask 方面可能会这样做

    @app.route('/something')
    def something():
        app.config['RESOURCE'].action(...)
        ...
    

    它调用一个方法来锁定对资源的访问并委托调用。

    def action(self, ...):
        with self.lock:
            self.resource.action(...)
    

    以这种方式锁定会阻塞其他可能想要同时访问资源的 Flask 线程。

    您可以从here 获取一个工作示例。查看control.py,忽略在单独线程中运行 Flask 的部分。

    这在开发服务器中运行良好。如果你在 uwsgi/gunicorn 下部署,所有的赌注都没有了。

    【讨论】:

    • 谢谢,这看起来像我想要的。如果我使用Blueprint,我会丢失app 变量,对吗? Flask 是否维护某种当前应用程序指针?
    • 使用from flask import current_app解决
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2018-08-26
    • 2020-09-21
    • 2012-12-25
    • 2019-08-26
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多