首页 > 解决方案 > django 频道的 websocket 握手失败

问题描述

编辑:@Ken4scholars 评论后更正

我有以下消费者在连接后立即失败

消费者.py

from channels.generic.websocket import AsyncJsonWebsocketConsumer
#...

class ListGeneratedTokensByFileConsumer(AsyncJsonWebsocketConsumer):

   stop = False

   async def websocket_connect(self,event):
      await self.accept()
      self.stop = False

   async def websocket_receive(self,event):

    await self.send_json({"text":"received","accept": True})
    await self.send_tokens_list()

  async def websocket_disconnect(self,event):

    self.stop = True

  async def send_tokens_list(self):

    some_path = "..."
    while self.stop == False:
        await asyncio.sleep(2)
        the_message = {}
        if os.path.isfile("some_file.json")):
            with open(os.path.join(some_path ,"some_file.json"),'r') as new_tok:
                        the_message = json.load(new_tok)
        if not the_message:
            print("waiting...")
        else:
            await self.send_json(the_message)

    await self.close()

它总是抛出错误:ERR_CONNECTION:RESEST并且 websocket 与 code 断开连接1006。这对于 django-channels 的最新变化似乎很熟悉,但由于我在 websocket 打开后发送文本并从消费者发送回消息,所以它应该可以解决问题。还是有什么问题?

路由.py

url(r'^myapp/sub_path/(?P<pk>\d+)/sub_sub_path/',ListGeneratedTokensByFileConsumer)

js中的websocket端点是:

.js

var loc = window.location;
var wsStart = "ws://";
if (loc.protocol == "https:") {
    wsStart = "wss://";
}
var endpoint = wsStart + loc.host + loc.pathname + "sub_sub_path" + "/";

有关信息,使用 channels-redis==2.3.2, channels==2.3.0, asgiref==3.2.2, daphne==2.3.0, django==2.0.8

标签: websocketdjango-channelschannels

解决方案


推荐阅读