2017-07-14 55 views
2

我正在創建一個系統,Twitter Live Streaming API通過給定的關鍵字獲取推文數據的實時流。每當推文發佈時,我都希望通過WebSockets(使用Django頻道)將新數據發送給所有連接的客戶端。這是我目前的程序:使用Django頻道向所有連接的客戶端發送信息

  1. Twitter的實時流代碼調用consumers.py initiateHandshake()功能一旦進入新的數據
  2. Django的通道發送文本「握手」到所有客戶端
  3. 客戶臨危握手消息,併發送回復消息
  4. 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}); 
    } 
} 

回答

1
initiateHandshake()

不會發送任何消息。

從DOC:在內存層不支持跨進程通信

請使用其他信道層類型特別Redis channel layer。一切都會按預期工作。

+0

請您詳細說明一下嗎?我需要做些什麼來解決我的問題? –

+0

已更新。請使用這個鏈接來設置[Redis channel layer](https://channels.readthedocs.io/en/stable/backends.html#redis) –

+0

它工作正常!非常感謝! –

相關問題