【发布时间】:2015-06-10 05:54:11
【问题描述】:
我在通过 SocketIO 从 RabbitMQ 向用户发送消息时遇到问题。
我有 SocketIO integration 的 Flask 应用程序。 当前用户流好像
问题是我无法设置通过 SocketIO 将消息转发到浏览器的 RabbitMQ 侦听器。每次我得到不同的错误。主要是连接已关闭,或者我在应用程序上下文之外工作。
我尝试了很多方法,这是我的最后一个。
# 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
如果有任何提示或使用示例,我将很高兴。
非常感谢
【问题讨论】:
-
我没有直接回答你所包含的内容(虽然图表很好) - 但我之前遇到过“请求上下文之外”的事情,这通常是一个问题(1) 尝试在烧瓶 API 之外调用烧瓶使用函数,这意味着烧瓶部分必须被排除在函数之外,或者 (2) 需要使用从烧瓶中提取的数据设置回调,以便烧瓶当回调稍后触发或(3)其他一些调用链丢弃烧瓶上下文并且未能传递所需的数据时将需要。不确定这是否会有所帮助。 :-/
-
我在您的示例中看不到它,但是您是否创建了应用程序上下文? flask.pocoo.org/docs/0.12/appcontext/…?当您在请求之外运行时,您需要推送上下文。
标签: python flask socket.io rabbitmq