我正在使用使用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是的,請檢查我的答案。 –