Приложение Flask Blueprint - Как получить контекст приложения в обратном вызове mqtt on_message - PullRequest
0 голосов
/ 29 ноября 2018

Я создал колбу с помощью светокопий.Это приложение получает данные через 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 голосов
/ 29 ноября 2018

Существует этот пакет - https://flask -mqtt.readthedocs.io / en / latest / - который может помочь, но он работает только с одним рабочим экземпляром.

В большинстве случаев вы задаете контекст приложения при создании объекта app.
Поэтому, где бы вы ни создавали свое приложение, вам следует инициализировать расширение.В вашем случае это звучит так, как будто functions.py нужно mqtt.py для выполнения своей логики, поэтому вы должны инициализировать своего mqtt клиента при создании приложения.

Из документации по фляге - http://flask.pocoo.org/docs/1.0/appcontext/

Если вы видите эту ошибку при настройке приложения, например при инициализации расширения, вы можете выдвинуть контекст вручную, поскольку у вас есть прямой доступ к приложению.Используйте app_context () в блоке with, и все, что выполняется в блоке, будет иметь доступ к current_app.

def create_app():
    app = Flask(__name__)

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

    return app
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...