2
我正在創建一個系統,Twitter Live Streaming API通過給定的關鍵字獲取推文數據的實時流。每當推文發佈時,我都希望通過WebSockets(使用Django頻道)將新數據發送給所有連接的客戶端。這是我目前的程序:使用Django頻道向所有連接的客戶端發送信息
- Twitter的實時流代碼調用consumers.py
initiateHandshake()
功能一旦進入新的數據 - Django的通道發送文本「握手」到所有客戶端
- 客戶臨危握手消息,併發送回復消息
- websocket.recieve函數接收此消息,並根據存儲在客戶端連接會話中的過濾器信息發回所需的數據(這就是爲什麼需要握手的原因 - 因爲每個客戶端都有它的自己的過濾器在其連接會話中)
現在,問題在於initiateHandshake()
中的「握手」消息沒有發送。爲什麼是這樣,我該如何解決它?非常感謝!我的代碼如下。
的WebSockets運行正常(如果客戶端發送一個消息,我可以用reply_channel回覆到它 - 所有的作品)
routing.py
from channels.routing import route
from tweetrunner.consumers import *
channel_routing = [
route("websocket.connect", ws_connect),
route("websocket.receive", ws_message),
route("websocket.disconnect", ws_disconnect),
]
consumers.py
# In consumers.py
from channels import Group, Channel
from channels.sessions import channel_session
from .models import InputTweet
from django.shortcuts import render
# Outside world connection
def initiateHandshake():
Group("table").send({"text": "handshake"})
# Connected to websocket.connect
@channel_session
def ws_connect(message):
# Accept connection
message.reply_channel.send({"accept": True})
message.channel_session["sort"] = "none"
# Add to group
Group("table").add(message.reply_channel)
# Connected to websocket.receive
@channel_session
def ws_message(message):
definition = message.content['text'][:1]
if definition == "1":
emotion = message.content['text'][1:]
message.channel_session["sort"] = message.content['text'][1:]
sendback = ""
if emotion == 'none':
given_tweets = InputTweet.objects.all()
given_tweets = given_tweets[(len(given_tweets) - 1250):]
print("before render")
sendback = render(None, 'tweetrunner/get_table_update.html', {'given_tweets': given_tweets})
print("rendered")
else:
given_tweets = InputTweet.objects.filter(emotion__startswith=emotion).order_by('score')
given_tweets = given_tweets[(len(given_tweets) - 1250):]
sendback = render(None, 'tweetrunner/get_table_update.html', {'given_tweets': given_tweets})
print("about to send")
message.reply_channel.send({
"text": sendback.content.decode('utf-8'),
})
print("sent -- END CONNECTION LOGS")
elif definition == "3":
print("Keep alive!")
else:
emotion = message.channel_session["sort"]
sendback = ""
print("entered 2")
if emotion == 'none':
given_tweets = InputTweet.objects.all()
given_tweets = given_tweets[(len(given_tweets) - 1250):]
print("before render")
sendback = render(None, 'tweetrunner/get_table_update.html', {'given_tweets': given_tweets})
print("rendered")
else:
given_tweets = InputTweet.objects.filter(emotion__startswith=emotion).order_by('score')
given_tweets = given_tweets[(len(given_tweets) - 1250):]
sendback = render(None, 'tweetrunner/get_table_update.html', {'given_tweets': given_tweets})
print("about to send")
#content = sendback.read()
message.reply_channel.send({
"text": sendback.content.decode('utf-8'),
})
print("sent -- END CONNECTION LOGS")
# Connected to websocket.disconnect
@channel_session
def ws_disconnect(message):
Group("table").discard(message.reply_channel)
我的代碼不在任何django應用程序中,正在像這樣初始化django(我可以訪問數據庫並使用django調用,所以它正在工作):
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "analyticsui.settings")
import django
django.setup()
的JavaScript在客戶端:當您使用在存儲器通道層
socket = new WebSocket("ws://" + window.location.host + "/");
socket.onmessage = function(e) {
alert("Got message: " + e.data)
if (e.data == "handshake") {
socket.send("2handshake");
alert("sent");
} else {
document.getElementById("tweetTable").innerHTML = e.data;
$('.tooltiphere').tooltip('remove');
$('.tooltiphere').tooltip({delay: 10});
}
}
請您詳細說明一下嗎?我需要做些什麼來解決我的問題? –
已更新。請使用這個鏈接來設置[Redis channel layer](https://channels.readthedocs.io/en/stable/backends.html#redis) –
它工作正常!非常感謝! –