【发布时间】:2019-06-04 01:10:13
【问题描述】:
我有一个 Django + Vue.js 聊天应用程序,我正在尝试连接到 django-channels。
要访问任何聊天室,您只需转到:
我的 javascript 连接如下所示:
connectToWebSocket () {
const chatSocket = new WebSocket(
`ws://localhost:8000/ws/rooms/${this.$route.params.id}/`
)
chatSocket.onopen = this.onOpen
chatSocket.onclose = this.onClose
chatSocket.onmessage = this.onMessage
chatSocket.onerror = this.onError
},
我的消费者.py:
class ChatConsumer(WebsocketConsumer):
def connect(self):
self.room_uri = self.scope['url_route']['kwargs']['uri']
self.room_group_name = 'chat_%s' % self.room_uri
# 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):
text_data_json = json.loads(text_data)
message = text_data_json['message']
user = text_data_json['user.username']
# Send message to room group
async_to_sync(self.channel_layer.group_send)(
self.room_group_name,
{
'type': 'chat_message',
'user': user,
'message': message
}
)
# Receive message from room group
def chat_message(self, event):
user = event['user']
message = event['message']
# Send message to WebSocket
self.send(text_data=json.dumps({
'user': user,
'message': message
}))
还有我的 routing.py:
from django.conf.urls import url
from core import consumers
websocket_urlpatterns = [
url(r'^ws/rooms/<uri>/', consumers.ChatConsumer),
]
我的项目routing.py:
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import core.routing
application = ProtocolTypeRouter({
'websocket': AuthMiddlewareStack(
URLRouter(
core.routing.websocket_urlpatterns
)
)
})
问题是,我无法连接到 websocket,我的 django 服务器说:
[失败实例:回溯::找不到路径“ws/rooms/759b9a8262ea4b7/”的路由。
我无法通过 websocket 连接到特定房间的代码有什么问题?
完整的堆栈跟踪:
[失败实例:回溯::找不到路径“ws/rooms/759b9a8262ea4b7/”的路由。 /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/autobahn/websocket/protocol.py:2801:processHandshake /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/txaio/tx.py:429:as_future /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/twisted/internet/defer.py:151:maybeDeferred /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/daphne/ws_protocol.py:82:onConnect --- --- /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/twisted/internet/defer.py:151:maybeDeferred /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/daphne/server.py:198:create_application /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/channels/staticfiles.py:41:调用 /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/channels/routing.py:58:调用 /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/channels/sessions.py:43:调用 /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/channels/sessions.py:141:调用 /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/channels/sessions.py:165:init /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/channels/middleware.py:31:调用 /home/dave/PycharmProjects/chatapp2/back/venv/lib/python3.6/site-packages/channels/routing.py:154:调用
【问题讨论】:
-
您正在使用 Django
urlsakare_path我建议您为您的 urlpattern 提供适当的正则表达式。可能是这个?url(r'^ws/rooms/(?P<id>\d+)/', consumers.ChatConsumer), -
@RajaSimon 谢谢,但我仍然遇到同样的错误
-
你能发布你的项目 routing.py 吗?
-
@RajaSimon 我已将其添加到我的问题中
-
这应该适用于您的设置。 r'^ws/rooms/(?P
[^/]+)/$' 我想不出任何其他为什么这不起作用的原因。
标签: python django django-channels