首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法连接到django通道上的使用web套接字的本地应用程序

无法连接到django通道上的使用web套接字的本地应用程序
EN

Stack Overflow用户
提问于 2022-09-23 08:20:34
回答 2查看 83关注 0票数 0

我试图使用web套接字连接到Django服务器/通道。HTTP视图正在工作,但是"ws“( WebSocket )连接正在被拒绝,,但只有上的反应本地应用程序。它在React应用程序上运行得很好

App.js For React本地移动应用程序

代码语言:javascript
复制
  var ws = React.useRef(
new WebSocket('ws://192.168.10.14:8000/ws/chat/Hello/'),
).current;
ws.onopen = () => {
    setServerState('Connected to the server');
  };
  ws.onclose = e => {
    setServerState('Disconnected. Check internet or server.');
  };
  ws.onerror = e => {
    console.error(e);
    setServerState(e.message);
  };
  ws.onmessage = e => {
    serverMessagesList.push(e.data);
    setServerMessages([...serverMessagesList]);
  };
  const submitMessage = () => {
    ws.send(messageText);
    setMessageText('');
    setInputFieldEmpty(true);
  };

我得到错误错误{"isTrusted":false,"message":“预期HTTP101Response,但'403访问被拒绝‘”}

但在网上

用于React 的App.js

代码语言:javascript
复制
  let W3CWebSocket = require("websocket").w3cwebsocket;
  var client = new W3CWebSocket("ws://192.168.10.14:8000/ws/chat/Hello/");
  client.onerror = function (e) {
    console.log("Connection Error: " + JSON.stringify(e));
    console.log("Connection Error");
  };

  client.onopen = function () {
    console.log("WebSocket Client Connected");
    let data = JSON.stringify({ message: "Hello Socket!" }); 
    client.send(data);
  };

  client.onclose = function () {
    console.log("echo-protocol Client Closed");
  };

  client.onmessage = function (e) {
    if (typeof e.data === "string") {
      console.log("Received: '" + e.data + "'");
    }
  };

这个代码运行得很好

现在是BackEnd url.py

代码语言:javascript
复制
websocket_urlpatterns = [
    re_path(r'ws/chat/(?P<room_name>\w+)/$', consumer.ChatConsumer.as_asgi()),
]

Consumer.py

代码语言:javascript
复制
from asgiref.sync import async_to_sync
import json
# WebsocketConsumer is a class that we can inherit from to create a consumer
# A consumer is a class that handles WebSocket connections
# so that we can send and receive messages over the WebSocket
from channels.generic.websocket import WebsocketConsumer


class ChatConsumer(WebsocketConsumer):
    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):
        print(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']

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

    # Receive message from room group
    def chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        self.send(text_data=json.dumps({
            'message': message
        }))

Settings.py

代码语言:javascript
复制
ASGI_APPLICATION = "xyz.asgi.application"


CHANNEL_LAYERS = {
    'default': {
        'BACKEND': "channels.layers.InMemoryChannelLayer",
        'hosts': [('localhost')],
    }
}

asgi.py

代码语言:javascript
复制
"""
ASGI config for XYZ project.

"""

import Appointments
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'XYZ.settings')

django_asgi_app = get_asgi_application()
application = ProtocolTypeRouter({
    "http": django_asgi_app,
    
    "websocket": AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                Appointments.urls.websocket_urlpatterns
            )
        )
    ),
})

注意:相同的backEnd在React.js中很好地工作,但是给出了上面提到的反应本地的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-29 20:00:19

已经内置了对WebSockets的支持,所以不需要下载任何外部库。

2-删除useRef将使其正常工作。

来自

代码语言:javascript
复制
 var ws = React.useRef(new WebSocket('ws://192.168.10.14:8000/ws/chat/Hello/'),

代码语言:javascript
复制
 var ws = new WebSocket('ws://192.168.10.14:8000/ws/chat/Hello/'),
票数 0
EN

Stack Overflow用户

发布于 2022-09-23 18:33:20

这是我以前遇到过的一个奇怪的错误。

对我起作用的是为这个移动应用程序创建一个不同的通道路径。

代码语言:javascript
复制
websocket_urlpatterns = [
re_path(r'ws/chat/(?P<room_name>\w+)/$', consumer.ChatConsumer.as_asgi()),
re_path(r'ws/mobile-chat/(?P<room_name>[^/]+)/$', 
consumer.ChatConsumer.as_asgi())
]

我不知道它为什么或如何工作,因为显然没有错误的理由,也没有解决办法,但我希望它也适用于你!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73824895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档