Flask Blueprint应用程序-如何在m​​qtt on_message回调中获取应用程序上下文

时间:2018-11-29 11:34:34

标签: python flask

我已经使用Blueprints创建了flask应用程序。 该应用程序通过paho.mqtt.client接收数据。 这也是处理数据并随后运行过程的触发器。

'system'是包含mqtt.py和functions.py

的蓝图
  • functions.py包含用于在收到数据后处理数据的功能
  • mqtt.py包含mqtt客户端的定义

mqtt.py

from app.system import functions
import paho.mqtt.client as mqtt
#....

def on_message(mqttc,obj,msg):   
    try:
        data = json.loads(msg.payload.decode('utf-8'))
        # start main process
        functions.process(data)
    except Exception as e:
        print("error: ", e)
        pass

一旦我收到数据并且触发了on_message回调,我就会遇到应用程序上下文错误:

错误:在应用程序上下文之外工作。

这通常意味着您尝试使用所需的功能 以某种方式与当前应用程序对象交互。解决 为此,使用app.app_context()设置应用程序上下文。见 文档以获取更多信息。

如何在on_message回调中获取应用程序上下文? 我尝试导入current_app并使用类似的内容

from flask import current_app
#...
def on_message(mqttc,obj,msg):   
    try:
        data = json.loads(msg.payload.decode('utf-8'))
        app = current_app._get_current_object()
        with app.app_context():
            # start main process
            functions.process(data)

我仍然遇到相同的错误

1 个答案:

答案 0 :(得分:0)

有这个软件包-https://flask-mqtt.readthedocs.io/en/latest/-可能会有所帮助,但仅适用于一个工作程序实例。

通常在创建app对象时设置应用程序上下文。
因此,无论您在哪里创建应用程序,都应该在其中初始化扩展程序。在您的情况下,听起来functions.py需要mqtt.py来执行其逻辑,因此您应在创建应用程序时初始化mqtt客户端。

从烧瓶文档-http://flask.pocoo.org/docs/1.0/appcontext/

  

如果在配置应用程序时看到该错误,例如   初始化扩展,因为您可以手动推送上下文   可以直接访问该应用。在with块中使用app_context(),然后   块中运行的所有内容都可以访问current_app。

def create_app():
    app = Flask(__name__)

    with app.app_context():
        #init_db()
        initialize mqtt client

    return app