私は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 :通話
url
を使用する必要があります。同じ問題がありました。
websocket_urlpatterns = [
path('ws/chat/<str:room_name>/$', consumers.ChatConsumer),
]
_
websocket_urlpatterns = [
url(r'^ws/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer),
]
_
私はあなたと同じ問題に出会った、そして今私はそれを解決するために起こった!私の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
]
_
そしてそれは働いた!あなたはそれを試すことができます
このようなものを試してみてください:
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'
_