我已经使用Blueprints创建了flask应用程序。 该应用程序通过paho.mqtt.client接收数据。 这也是处理数据并随后运行过程的触发器。
'system'是包含mqtt.py和functions.py
的蓝图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)
我仍然遇到相同的错误
答案 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