【问题标题】:Django channels Websocket DisconnectDjango 通道 Websocket 断开连接
【发布时间】:2019-05-31 04:53:03
【问题描述】:

我希望我的 Django 应用程序“popinion1”通过短信与本地计算机进行通信。

点冻结:

asgi-redis==1.4.3
asgiref==2.3.2
async-timeout==3.0.1
autobahn==18.12.1
channels==2.1.3
daphne==2.2.4
Django==2.1.3
redis==2.10.6
Twisted==18.9.0

当我执行“manage.py runserver”时,似乎有连接或至少没有错误

但是,一旦我在终端中刷新浏览器,我就会得到:

  • 错误 - ws_protocol - [失败实例:回溯:类'ValueError'>:找不到路径'输入/'的路由[很多行] 结尾:WebSocket DISCONNECT /input/ [127.0.0.1:50506]

“/input/”是我的应用程序。 Firefox 检查员报告:

Firefox 无法使用 ws://127.0.0.1:8000 建立与服务器的连接

/input/ 是我的应用程序。

我的 routing.py 是

from django.conf.urls import url
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator
from input.consumers import ChatConsumer


print('ChatConsumer: ', ChatConsumer.name)

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                    url(r'^input/(?P<username>[\w.@+-]+)/$', ChatConsumer),
                ]
            )
        )
    )
})

html模板中的javascript:

<script>

    console.log(window.location)
    var loc = window.location
    var wsStart = 'ws://'
    if (loc.protocol == 'https:'){
        wsStart = 'wss://'
    }
    var endpoint = wsStart + loc.host + loc.pathname
    var socket = new WebSocket(endpoint)


    socket.onmessage = function(e){
        console.log("message", e)
    }
    socket.onopen= function(e){
        console.log("open", e)
    }
    socket.onerror= function(e){
        console.log("error", e)
    }
    socket.onclose= function(e){
        console.log("close", e)
    }
</script>

我的消费者.py

import asyncio
import json
from django.contrib.auth import get_user_model
from channels.consumer import AsyncConsumer
from channels.db import database_sync_to_async
from .models import Thread, ChatMessage

from asgiref.sync import async_to_sync

class ChatConsumer(AsyncConsumer):
    name = 'ChatConsumer'

    async def websocket_connect(self, event):
        print('connected! ', event)
        await self.send({
            "type": "websocket.accept"
        })

    async def websocket_receive(self, event):
        print('receive! ', event)


    async def websocket_disconnect(self, event):
        print('disconnected! ', event)

settings.py 中的CHANNEL_LAYERS

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'asgi_redis.core.RedisChannelLayer',
        'CONFIG': {
            'hosts': [('localhost', 6379)],
        },
        #'ROUTING': 'popinion_project.routing.channel_routing',
    }
}

那么它是在 routing.py 中的错误地址吗?同样奇怪的是在 routing.py 中最后一次导入“ChatConsumer”。这是“未解决的参考”,但打印语句有效。

print('ChatConsumer: ', ChatConsumer.name)

我正在学习本教程

https://www.youtube.com/watch?v=RVH05S1qab8

我很高兴知道如何连接 websocket。希望提供所有必要的信息。提前致谢

【问题讨论】:

  • 你能提供你从 JS 连接到的完整端点吗?
  • 抱歉我的无知 - 但这到底是什么意思?
  • 您从前端连接到的 websocket 的端点。它应该与此 URL url(r'^input/(?P&lt;username&gt;[\w.@+-]+)/$', ChatConsumer) 的正则表达式匹配,但它不匹配,这就是您收到错误的原因。在连接之前尝试在 javascript 控制台中打印它。这样你就可以验证 enpoint
  • 端点看起来正确 "ws://127.0.0.1:8000/input/" 并且还安装了 channels_redis 并将 CHANNELS_LAYERS 重新映射到 'BACKEND': 'channels_redis.core.RedisChannelLayer' 似乎可以解决问题.感谢端点的提示。
  • 那么问题是您没有像我所怀疑的那样添加 url 的用户名部分。很好,你解决了。通道层应该与另一个错误有关

标签: python-3.x websocket django-channels


【解决方案1】:

我使用的解决方案。这与使用 url 有关。

from django.urls import re_path
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator

from chat.consumers import ChatConsumer
    application = ProtocolTypeRouter({
    # Empty for now (http->django views is added by default)
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                    re_path(r"^messages/(?P<username>[\w.@+-]+)", ChatConsumer),
                ]
            )
        )
    )
})

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 2021-03-07
    • 2020-11-30
    • 2019-02-23
    • 2018-08-20
    • 2020-07-17
    • 2023-02-25
    • 2018-11-23
    相关资源
    最近更新 更多