当前位置: 首页 > 知识库问答 >
问题:

Django ValueError:找不到路径“ws/chat/”的路由

爱繁
2023-03-14

我正在使用youtube上的教程制作一个简单的聊天应用程序(github链接:link)。一个潜在的问题是本教程使用2。django的x版本,但我有3.1。7,但我让它工作得很好,很接近,但随后开始出现以下错误:

ValueError:没有找到路径'ws/chat//'的路由

当查看我的终端时,它一直试图一遍又一遍地重新连接,可能是因为我使用了重新连接WebSocket github javascript代码。当我运行redis-cli并键入ping时,我得到PONG作为回报,所以我认为这是正常工作的。

下面是我的代码:

routing.py(我相信这似乎是最有可能的问题所在)

from django.urls import re_path
from . import consumers

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

wsgi。py:

import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
application = get_wsgi_application()

settings.py:

WSGI_APPLICATION = 'django_project.wsgi.application'
ASGI_APPLICATION = 'django_project.asgi.application' # older version of django: 'django_project.routing.application'
# Channels redis config:
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}

意见。py:

来自django。快捷方式从django导入呈现导入json。contrib。auth。装饰程序从django导入所需的登录名。乌提尔斯。safestring导入标记\u safe

def索引(请求):返回渲染(请求,'聊天/index.html')

@login_required def room(请求,room_name):返回render(请求,'chat/room.html',{'room_name_json':room_name})

网址。来自django的py。URL导入路径,包括从。导入视图

app_name = 'chat'

urlpatterns = [
    path('chat/', views.index, name='index'),
    path('chat/<str:room_name>/', views.room, name='room'),
]

房间html:

{% load static %}
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Chat Room</title>
</head>
<body>
    <script src="{% static '/reconnecting_websockets.js' %}"></script>
    <textarea id="chat-log" cols="100" rows="20"></textarea><br>
    <input id="chat-message-input" type="text" size="100"><br>
    <input id="chat-message-submit" type="button" value="Send">
    {{ room_name|json_script:"room-name" }}
    <script>
        const roomName = JSON.parse(document.getElementById('room-name').textContent);

        const chatSocket = new ReconnectingWebSocket(
            'ws://'
            + window.location.host
            + '/ws/chat/'
            + roomName
            + '/'
        );

        chatSocket.onmessage = function(e) {
            const data = JSON.parse(e.data);
            document.querySelector('#chat-log').value += (data.message + '\n'); //grabbing the textarea with id(#) 'chat-log'
        };

        chatSocket.onclose = function(e) {
            console.error('Chat socket closed unexpectedly');
        };

        document.querySelector('#chat-message-input').focus();
        document.querySelector('#chat-message-input').onkeyup = function(e) {
            if (e.keyCode === 13) {  // enter, return
                document.querySelector('#chat-message-submit').click();
            }
        };

        document.querySelector('#chat-message-submit').onclick = function(e) {
            const messageInputDom = document.querySelector('#chat-message-input');
            const message = messageInputDom.value;
            chatSocket.send(JSON.stringify({
                'message': message,
                'command': 'fetch_messages'
            }));
            messageInputDom.value = ''; //reset value to empty string
        };
    </script>
</body>
</html>

消费者。py:

从asgiref导入json。同步从通道导入异步到同步。通用的websocket从导入WebsocketConsumer。模型从django导入消息。contrib。auth。模型导入用户

ChatConsumer类(WebsocketConsumer):

def fetch_messages(self, data):
    messages = Message.last_10_messages(self)
    content = {
        'command': 'messages',
        'messages': self.messages_to_json(messages)
    }
    self.send_message(content)


def new_message(self, data):
    author_user = User.objects.filter(username='admin')[0]
    message = Message.objects.create(author=author_user, content=data['message'])
    content = {
        'command': 'new_message',
        'message': self.message_to_json(message)
    }
    return self.send_chat_message(content)


def messages_to_json(self, messages):
    result = []
    for message in messages:
        result.append(self.message_to_json(message))
    return result

def message_to_json(self, message):
    return {
        'author': message.author.username,
        'content': message.content,
        'timestamp': str(message.timestamp)
    }

commands = {
    'fetch_messages': fetch_messages,
    'new_message': new_message
}


def connect(self):
    self.room_name = self.scope['url_route']['kwargs']['room_name']
    self.room_group_name = 'chat_%s' % self.room_name

    # Join room group
    async_to_sync(self.channel_layer.group_add)(
        self.room_group_name,
        self.channel_name
    )

    self.accept()

def disconnect(self, close_code):
    # Leave room group
    async_to_sync(self.channel_layer.group_discard)(
        self.room_group_name,
        self.channel_name
    )

# Receive message from WebSocket
def receive(self, text_data):
    data = json.loads(text_data)
    self.commands[data['command']](self, data) # either fetch_messages or new_message

def send_chat_message(self, message):
    print('in send_chat_message')
    async_to_sync(self.channel_layer.group_send)( # Send message to room group
        self.room_group_name,
        {
            'type': 'chat_message',
            'message': message
        }
    )

def send_message(self, message):
    print('message: ' + str(message))
    self.send(text_data=json.dumps(message))

# Receive message from room group
def chat_message(self, event):
    message = event['message']
    content1 = message['message']
    content2 = content1['content']
    #self.send(text_data=json.dumps(content2)) # Send message to WebSocket
    self.send(text_data=json.dumps(content2)) # Send message to WebSocket

共有1个答案

谢胤
2023-03-14

解决方案:当我更改视图时。对于这一点,它起了作用:

@login_required
def room(request, room_name):
    print('~~~DEBUG~~~')
    return render(request, 'chat/room.html', {
        'room_name': room_name
 类似资料:
  • 16.2. 找到路径 从命令行运行 Python 代码时,知道所运行代码所在磁盘上的存储位置有时候是有必要的。 这是一个你很难自己弄明白,却一看到就会想起的小麻烦。核心功能来源于 sys.argv。正如你在 第 9 章 XML 处理 中看到的,它包含了很多命令行参数。 当然就像从命令行中运行他们一样,它也同样记录了运行脚本的名字,这些信息足以令我们确定文件的位置。 例 16.3. fullpath

  • 我有3个项目,ProjectB,ProjectC。 当我构建ProjectB时,它没有任何问题。但是当我试图构建ProjectA时,它在控制台上出现以下错误而失败。 评估项目“:ProjectB”时出现问题。在项目:ProjectB中找不到路径为:ProjectC的项目。 build.gradle-ProjectC settings.gradle-ProjectC build.gradle - 项

  • 我对这个问题做了一些研究,但仍然无法解决。我还在这里搜索了堆栈溢出的其他方法,但到目前为止还没有成功。我试过不带样例,把它移到另一个文件夹,没有效果。结构如下: 主要Java代码 controller.java代码 我跟随本教程学习更多关于JavaFX和XML的知识。

  • 我有一个Django Vue。我正在尝试连接到django频道的js聊天应用程序。 要访问任何聊天室,您只需访问: http://localhost:8080/rooms/"id"/ 我的javascript连接如下所示: 我的consumers.py: 我的routing.py: 我的项目routing.py: 问题是,我无法连接到websocket,我的django服务器说: [失败实例:回溯

  • 我已经安装了java11使用 然后,我尝试了下面的方法来将JAVA\u带回家 它返回为空。因此,按照echo$JAVA\u HOME中的说明操作不会返回任何结果 当我运行ls-l/usr/bin/java时,我看不到上面链接中显示的任何jvm路径。下面是我得到的 如何设置JAVA\u主页

  • 我是maven的新手,在添加依赖项(sl4j)时遇到了麻烦。我得到的这个项目显然是从Ant转换成maven的。顺便说一句,干净的安装是不起作用的。下面是pom.xml: 它在干净安装时会给出以下消息: