websocket握手不成功

来源:9-14 前端WebSocket API讲解

ian116

2020-11-18

websocket disconnect, websocket握手不成功,是routing中几个认证没通过吗?实在查不出问题,麻烦老师帮忙看下,谢谢
图片描述
图片描述
后端代码:
图片描述
图片描述
图片描述

写回答

3回答

weixin_慕丝9404249

2021-01-08

我是同样的报错,不过问题解决了,版本不一样了, 弄了两晚才成功

反馈下,给和我一样强迫症想试试新版本的同学参考:

------------------------------------------

channels 3.0.0起的调整:


1、在路由设置中必须使用as_asgi()方法(类似django的as_view()):

websocket_urlpatterns = [
    re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),]
# 官方文档


2、在ProtocolTypeRouter中必须显示地指出‘http’:

from django.core.asgi import get_asgi_application

application = ProtocolTypeRouter({
    "http": get_asgi_application(), # 必须!
    # Other protocols here.})
    
# 官方文档

这里和老师视频中的可选(可写可不写)不一样了,使用新版本的需要注意

--------------------------------------------------

还有两个不一样的地方:


1、老师新建了routings.py来放路由,我直接写在asgi.py里了,好像官方文档默认就是这个


2、实际上根据上面新版本作了调试之后还是有报错,显示redis连接不成功(但实际Redis运行正常),很可能与这里有关:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [f'{env("REDIS_URL", default="redis://127.0.0.1:6379")}/3', ],  # channels layer 缓存
        },
    },
}

我查看了Redis版本,是3.X版本(yum install redis 似乎没有最近的版本)

于是卸载了,重新安装了最新稳定版( Redis-6.0.9)


然后重启了一下成功了


此外,上面“}/3'”这个地方我的好像报了下错,最好不要有空格


2
1
Jack
不错,加精置顶!感谢同学的耐心回答
2021-01-11
共1条回复

Jack

2020-11-20

你说得对,版本问题是极有可能的,先换下这些试试

Django==2.1.7

channels==2.1.7

celery==4.3.0rc3

0
0

Jack

2020-11-19

您好,看这里应该是后端哪个地方写错了

//img1.sycdn.imooc.com/szimg/5fb5d84a0984a44508730047.jpg

麻烦截图一下后端代码,websocket连接和认证 ,路由的部分

0
1
ian116
和master的源码比较过,没看出哪写错了。麻烦老师帮忙看下,谢谢。 另外channels是3.0.2,django3.1.3,不知道是不是版本没对齐导致的...
2020-11-19
共1条回复

Django高级实战 开发企业级问答网站

融合Django高级用法/算法/设计模式/TestCase测试/云计算打造项目

908 学习 · 757 问题

查看课程