我最近遵循官方Django Channels文档(版本4.0.0)在我的Django项目中设置了WebSockets。我已经检查了documentation tutorial并正确配置了我的项目。然而,当我尝试使用websocketking测试服务时,我遇到了握手问题。
以下是关于我的配置的一些细节:
1.我的asgi.py文件看起来像这样:
import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "schatai.settings")
django_asgi_app = get_asgi_application()
import schatai.routing
application = ProtocolTypeRouter(
{
"http": django_asgi_app,
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(URLRouter(schatai.routing.websocket_urlpatterns))
),
}
)
1.我的consumers.py文件看起来像这样:
import json
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
class WsTestConsumer(WebsocketConsumer):
def connect(self):
self.accept()
def disconnect(self, close_code):
pass
# 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}))
1.我的routing.py文件看起来像这样:
from django.urls import re_path, path
from . import consumers
websocket_urlpatterns = [
re_path(r"ws/chat/(?P<room_name>\w+)/$", consumers.SchataiConsumer.as_asgi()),
path(r"ws/", consumers.WsTestConsumer.as_asgi()),
]
1.我还根据文档配置了我的settings.py文件。
当我运行python manage.py runserver命令时,服务器在ASGI上成功启动。
但是,当我尝试使用websocketking测试我的服务时,我收到以下错误消息:
WebSocket HANDSHAKING /ws/ [127.0.0.1:48198]
WebSocket REJECT /ws/ [127.0.0.1:48198]
WebSocket DISCONNECT /ws/ [127.0.0.1:48198]
我想知道是否有人以前遇到过这个问题,或者他们是否知道是什么导致了这个握手问题。任何帮助或建议将不胜感激。
提前感谢您的帮助!
1条答案
按热度按时间rnmwe5a21#
在遇到Django Channels的握手问题并进行彻底的研究后,我已经能够解决这个问题。以下是我找到的解决方案:
错误消息“WebSocket HANDSHAKING”后跟“WebSocket RESISTANCE”表示WebSocket服务器无法接受连接。这可能是由于几个原因,但一个常见的原因是Django中允许的起源(AllowedOrigin)配置不正确。
要解决此问题,请执行以下步骤:
1.打开Django项目的settings.py文件。
1.确保ALLOWED_HOSTS变量已正确配置为包含应用程序使用的IP地址或域名。举例来说:
ALLOWED_HOSTS = 127.0.0.1','localhost','websocketking.com']
1.重新启动Django服务器以应用新的更改。
没关系,这是帮我的documentation