web-dev-qa-db-ja.com

Django-Channels:パスのルートが見つかりませんでした

私はDjango-Channelsに接続しようとしているDjango + vue.jsチャットアプリケーションを持っています。

チャットルームにアクセスするには、単に行くだけです。

http:// localhost:8080 /部屋/ "id" /

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
},
_

私の消費者。

_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に接続できません.My Djangoサーバーは次のように述べています。

[障害インスタンス:TraceBack :: Path 'WS/Rooms/759B9A8262EA4B7 /'のルートが見つかりました。

WebScocketを介して特定の部屋に接続できないコードの問題は何ですか?

フルスタックトレース:

[障害インスタンス:TraceBack :: Path 'WS/Rooms/759B9A8262EA4B7 /'のルートが見つかりました。 /hatapp2/back/venv/lib/python3.6/site-packages/autobahn/websocket/protocol.pakages/autobahn/websocket/protocol.py:2801:プロセッスハンドシェイク/ホーム/ Dave/PycharmProjects/Chatapp2/Back/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 /hatapp2/back/venv/lib/python3.6/site-packages/daphne/ws_protocol.py:82:onconnect --- ---/home/dave/pycharmprojects/chatapp2/back/denv /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:call/home/dave/pycharmprojects/ChatApp2/Back/VENV/lib/python3.6/site-packages/channels/routing.py:58: Call /home/dave/pycharmprojects/chatapp2/back/venv/lib/python3.6 /サイトパッケージ/チャンネル/ S. Essions.py:43:call /hatapp2/back/venv/lib/python3.6/site-packages/channels/session.py:141:コール) /home/dave/pycharmprojects/chatapp2/back/venv/lib/python3.6/site-packages/channels/sessions.py:165:init/home/dave/pycharmprojects/chatapp2 /backer/venv/lib/python3.6/site-packages/channels/middleware.py:31:call /hat/dave/pycharmprojects/chatapp2/back/venv/lib/python3.6/サイトパッケージ/チャンネル/ routing.py:154 :通話

6
Desiigner

urlを使用する必要があります。同じ問題がありました。

勤務していません

websocket_urlpatterns = [
  path('ws/chat/<str:room_name>/$', consumers.ChatConsumer),
]
 _

働く

websocket_urlpatterns = [
   url(r'^ws/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer),
]
 _
4
juan aparicio

私はあなたと同じ問題に出会った、そして今私はそれを解決するために起こった!私のws_client.pyではこれを書きました

ws.create_connection("ws://127.0.0.1:8000/alarm")
 _

そしてrouting.py私は以下に変更され、それが働いた

from Django.urls import path
channel_routing = [
    path('alarm',consumers.ws_message),
    # before I wrote 'alarm/', I just change from alarm/ to alarm
]
 _

そしてそれは働いた!あなたはそれを試すことができます

1
LittleCabbage

このようなものを試してみてください:

routing.py(あなたのDjangoアプリ)

from Django.urls import path
from core import consumers

websocket_urlpatterns = [
    path('ws/rooms/<uri>/', consumers.ChatConsumer),
]
 _

routing.py(あなたのsettings.pyと同じレベル)

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import myapp.routing

application = ProtocolTypeRouter({
    # (http->Django views is added by default)
    'websocket': AuthMiddlewareStack(
        URLRouter(
            myapp.routing.websocket_urlpatterns
        )
    ),
})
 _

そして最後にあなたの設定で.py

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [REDIS_URL],
        },
    },
}

INSTALLED_APPS.append('channels')
ASGI_APPLICATION = 'myapp.routing.application'
 _
0
Giannis Katsini