【问题标题】:WebSocket connection to 'ws:/' failed: Error during WebSocket handshake: Unexpected response code: 200WebSocket 连接到“ws:/”失败:WebSocket 握手期间出错:意外响应代码:200
【发布时间】:2021-01-29 00:58:10
【问题描述】:

我使用Django-channels连接服务器,但总是显示如下错误:

reconnectwebsockets.js WebSocket connection to 'ws:xxx' failed: 
Error during WebSocket handshake: Unexpected response code: 200

另外,我使用的是docker,这可能是docker容器配置的问题? 有什么想法可能是错误的吗?

【问题讨论】:

    标签: django django-channels


    【解决方案1】:

    问题详情

    您好,您是否尝试使用channels 库?它将为您提供与Django-channels 相同的强大功能。 Here你可以找到它的必要文档。

    我推荐你使用它,因为它比Django-channels 更灵活。

    频道库

    快速入门

    您可以在Tutorial 阅读如何使用它。

    错误及解决办法

    意外响应代码:200(或其他代码XXX)(已解决):

    • 确保通过settings (mysite.settings) 包含您的应用程序和频道,并使用asgi 应用程序:
    INSTALLED_APPS = [
        'channels',
        'chat',
        ...
    ]
    ...
    ASGI_APPLICATION = "mysite.asgi.application"
    
    • 确保使用通道层 (mysite.settings)。
    CHANNEL_LAYERS = {
        'default': {
            'BACKEND': 'channels.layers.InMemoryChannelLayer',
        },
    }
    

    根据Documentation,您应该使用数据库进行生产,但对于本地环境,您可以使用channels.layers.InMemoryChannelLayer。

    • 确保您运行 asgi 服务器(不是 wsgi),因为您需要异步行为。此外,对于部署,您应该使用daphne 而不是gunicorn。 daphne 默认包含在 channels 库中,因此您无需手动安装。 基本运行服务器将如下所示(终端):
    daphne -b 0.0.0.0 -p $PORT mysite.asgi:application
    

    其中$PORT 是特定端口(对于 UNIX 系统是 5000)。 (heroku 应用使用的格式,你可以手动更改)。

    连接建立错误:net::ERR_SSL_PROTOCOL_ERROR 和使用 https 连接的相同错误(已解决):

    Difference between ws and wss?

    您可能会考虑通过 wss 协议使用您的服务器: 将ws://... 替换为wss://... 或在您的html (chat/templates/chat/room.html) 中使用以下模板:

    (window.location.protocol === 'https:' ? 'wss' : 'ws') + '://'
    

    希望这个答案对channels 和Django 有用。

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 2016-05-27
      • 2015-07-22
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 2020-04-03
      • 2019-09-01
      • 1970-01-01
      相关资源
      最近更新 更多