我正在使用this tutorial from youtube制作一个简单的聊天应用程序(github链接在这里:一个潜在的问题是,教程使用的是2.x版本的django,但我有3.1.7,但我有它的工作相当不错,并接近,但后来开始得到这个错误:ValueError: No route found for path 'ws/chat//'
当我查看我的终端时,它一直在尝试一次又一次地重新连接,可能是因为我使用的是ReconnectingWebSocket github javascript code。当我运行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
]
工作组名称:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
application = get_wsgi_application()
设置.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:
# chat/views.py
from django.shortcuts import render
import json
from django.contrib.auth.decorators import login_required
from django.utils.safestring import mark_safe
def index(request):
return render(request, 'chat/index.html')
@login_required
def room(request, room_name):
return render(request, 'chat/room.html', {
'room_name_json': room_name
})
urls.py来自django.urls导入路径,包括来自. import视图
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:
# chat/consumers.py
import json
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
from .models import Message
from django.contrib.auth.models import User
class 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条答案
按热度按时间vlju58qv1#
解决方案:当我将www.example.com更改views.py为这个时,它工作了: