Я столкнулся с проблемой при передаче сообщений от RabbitMQ пользователю через SocketIO.
У меня есть приложение Flask с интеграция SocketIO. Текущий поток пользователя выглядит как
Проблема в том, что я не могу настроить слушателя RabbitMQ, который передает сообщения в браузер через SocketIO. Каждый раз, когда я получаю другую ошибку. В основном это закрытие соединения, или я работаю вне контекста приложения.
Я пробовал много подходов, вот мой последний.
# callback
def mq_listen(uid):
rabbit = RabbitMQ()
def cb(ch, method, properties, body, mq=rabbit):
to_return = [0] # mutable
message = Message.load(body)
to_return[0] = message.get_message()
emit('report_part', {"data": to_return[0]})
rabbit.listen('results', callback=cb, id=uid)
# this is the page, which user reach
@blueprint.route('/report_result/<uid>', methods=['GET'])
def report_result(uid):
thread = threading.Thread(target=mq_listen, args=(uid,))
thread.start()
return render_template("property/report_result.html", socket_id=uid)
где метод rabbit.listen представляет собой абстракцию, подобную:
def listen(self, queue_name, callback=None, id=None):
if callback is not None:
callback_function = callback
else:
callback_function = self.__callback
if id is None:
self.channel.queue_declare(queue=queue_name, durable=True)
self.channel.basic_qos(prefetch_count=1)
self.consumer_tag = self.channel.basic_consume(callback_function, queue=queue_name)
self.channel.start_consuming()
else:
self.channel.exchange_declare(exchange=queue_name, type='direct')
result = self.channel.queue_declare(exclusive=True)
exchange_name = result.method.queue
self.channel.queue_bind(exchange=queue_name, queue=exchange_name, routing_key=id)
self.channel.basic_consume(callback_function, queue=exchange_name, no_ack=True)
self.channel.start_consuming()
что привело к
RuntimeError: working outside of request context
Я буду рад за любой совет или пример использования.
Спасибо большое