首页 > 解决方案 > WebSocket 失败:WebSocket 握手期间出错

问题描述

我正在尝试使用 django-channels 为 django 应用程序创建一个 Web 套接字。我已将 django 更改为使用ASGI服务器接口而不是默认接口,WSGI并且我定义了以下通道层:

设置.py

CHANNEL_LAYERS = {
    'default': { 
        'BACKEND': 'asgi_redis.RedisChannelLayer',
        'CONFIG': {
            'hosts': [('localhost', 6379)],
        },
        'ROUTING': 'rest.routing.application',
    }
}

ASGI_APPLICATION = 'rest.routing.application'

asgi.py

import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rest.settings")
django.setup()
application = get_default_application()

路由.py

application = ProtocolTypeRouter({

    "websocket": URLRouter([
            url(r"^receive/$", websocket_receive),
            url(r"^connect/$", websocket_connect),
        ])
})

消费者.py

def websocket_connect(self, event):
    self.send({
        "type": "websocket.accept",
    })

问题是当我尝试测试它时

socket = new WebSocket("ws://" + window.location.host + "/connect/");
socket.onopen = function() {
    socket.send("hello world");
}

我不断得到

WebSocket 连接到“ws://localhost:8000/connect/”失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET

[Failure instance: Traceback: <class 'AttributeError'>: 'dict' object has no attribute 'send'
C:\Python37\lib\site-packages\autobahn\websocket\protocol.py:2800:processHandshake
C:\Python37\lib\site-packages\txaio\tx.py:429:as_future
C:\Python37\lib\site-packages\twisted\internet\defer.py:151:maybeDeferred
C:\Python37\lib\site-packages\daphne\ws_protocol.py:77:onConnect
--- <exception caught here> ---
C:\Python37\lib\site-packages\twisted\internet\defer.py:151:maybeDeferred
C:\Python37\lib\site-packages\daphne\server.py:186:create_application
C:\Python37\lib\site-packages\channels\staticfiles.py:41:__call__
C:\Python37\lib\site-packages\channels\routing.py:58:__call__
C:\Python37\lib\site-packages\channels\routing.py:144:__call__
C:.......\consumers.py:28:websocket_connect

知道这里可能出了什么问题吗?

标签: djangowebsocketdjango-channels

解决方案


推荐阅读