python - WebSocket服务器拒绝Django Channels中的所有连接
问题描述
我正在与 django(后端)聊天并做出反应(前端)。我使用 Django Channels 创建 WebSocket 服务器,但它无法正常工作:尝试连接 React 时,它会抛出
Forums.jsx:61 WebSocket connection to 'ws://localhost:8000/forums/divers/' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET
导航控制台。今天早上它可以工作,但是今天下午,在关闭并重新打开 2 台服务器后,它无法正常工作。在此期间,我只启动了一个系统来将消息存储在数据库中。消费者:
from channels.generic.websocket import WebsocketConsumer
import json
from .models import Message
class ChatConsumer(WebsocketConsumer):
async def connect(self):
self.forum = self.scope["url_route"]["kwargs"]["forum"]
# Join room group
await self.channel_layer.group_add(
self.forum,
self.channel_name
)
print("connect func")
self.accept()
async def disconnect(self, close_code):
await self.channel_layer.group_discard(
self.forum,
self.channel_name
)
async def receive(self, text_data=None, bytes_data=None):
text_data_json = json.loads(text_data)
message = text_data_json['message']
print(message)
await self.channel_layer.group_send(
self.forum,
{
'type': 'chat_message',
'message': message
}
)
async def chat_message(self, event):
message = event['message']
#await sync_to_async(Message.objects.create)(message=message["message"], )
# Send message to WebSocket
await self.send(text_data=json.dumps({
'message': message
}))
WebSocket客户端的开启:
class Forum extends Component {
constructor(props) {
super(props)
...
this.URL = constants.BACKEND_WS + "/forums/" + this.state.forum + "/";
this.ws = new WebSocket(this.URL)
}
componentDidMount() {
console.log("didmount");
this.ws.onopen = () => {
console.log('connected')
};
this.ws.onmessage = evt => {
const message = JSON.parse(evt.data);
console.log(message);
this.addMessage(message)
};
this.ws.onclose = () => {
console.log('disconnected');
this.setState({
ws: new WebSocket(this.URL),
})
}
}
}
django 服务器的日志:
WebSocket HANDSHAKING /forums/divers/ [127.0.0.1:52726]
WebSocket DISCONNECT /forums/divers/ [127.0.0.1:52726]
mysite/routings.py :
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import forums.routing
application = ProtocolTypeRouter({
'websocket': AuthMiddlewareStack(
URLRouter(
forums.routing.websocket_urlpatterns
)
),
})
论坛/路由.py:
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'forums/(?P<forum>\w+)/$', consumers.ChatConsumer),
]
如果有人能解释我如何解决这个问题,他真的会帮助我。
编辑:当我删除async
并替换await
为async_to_sync
时,它可以工作。有人能解释一下为什么它是同步工作而不是异步工作吗?
解决方案
我通过替换解决了我的WebsocketConsumer
问题AsyncWebsocketConsumer
。
推荐阅读
- mysql - 如何在 laravel 迁移中编辑原始表?
- node.js - MONGO 只得到文件的名称而不是整个文件
- c# - 如何在远程机器上调试程序?
- java - Kafka 消费者自定义 MetricReporter 未收到指标
- reactjs - 将 SSL 添加到服务器端呈现的应用程序
- android - 如何将 FontAwesome 图标用作 RadioButton 按钮
- amazon-mws - 使用 MWS API 向亚马逊订单添加多个跟踪号
- python - 在 python 脚本中使用 awk 时的格式问题
- php - 在本地运行 html 和 php 页面时避免跨源错误
- c# - 无法将位图转换为字节 []