我正在使用使用websockets的Django和Django频道构建web应用程序。从另一个消费者在一个Django频道消费者中断开循环
当用户点击浏览器上的按钮,可将WebSocket将数据发送到我的服务器和客户服务器上启动每秒消息发送到客户端一次(环路)。
我想创建另一个按钮,将停止该数据发送过程。当用户点击这个新按钮时,websocket会向服务器发送另一个数据,并且服务器上的使用者必须以某种方式停止之前使用者的循环。此外,我会要求这停止客户端断开连接时的循环。
我觉得想要使用全局变量。但是Django Channels文档声明,他们强烈建议不要使用全局变量,因为他们希望保持应用程序网络的透明性(不太了解这一点)。
我试过使用通道会话。我让第二个消费者更新频道会话中的值,但频道会话值没有在第一个消费者中更新。
这是简化的代码。 浏览器:在服务器
var socket = new WebSocket("ws://" + window.location.host + "/socket/");
$('#button1').on('click', function() {
socket.send(JSON.stringify({action: 'start_getting_values'}))
});
$('#button2').on('click', function() {
socket.send(JSON.stringify({action: 'stop_getting_values'}))
});
消费者:
@channel_session
def ws_message(message):
text = json.loads(message.content['text'])
if text['action'] == 'start_getting_values':
while True:
# Getting some data here
# ...
message.reply_channel.send({"text": some_data}, immediately=True)
time.sleep(1)
if text['action'] == 'stop_getting_values':
do_something_to_stop_the_loop_above()
你找到一个解决这个问题? – Vingtoft
@Vingtoft是的,请检查我的答案。 –