根据您提供的代码和错误信息,可以看到Websocket连接请求的URL为ws://127.0.0.1:8000/ws/wscon。根据您提供的路由配置代码,Websocket连接请求应该匹配到URL为ws/(?P<websocket>\w+)/$的路由,并将请求的参数作为websocket传递给ChatConsumer类。
但是,您在路由配置代码中没有指定websocket参数的名称,导致chat_consumer.ChatConsumer.as_asgi()方法中无法解析该参数,因此出现了404 Not found错误。
为了解决这个问题,您需要将路由配置代码中的正则表达式修改为ws/(?P<websocket_name>\w+)/$,然后将websocket_name作为参数传递给ChatConsumer类。修改后的代码如下:
- websocket_urlpatterns = [
- # 正则表达式创造websocket接口
- re_path(r'ws/(?P<websocket_name>\w+)/$', chat_consumer.ChatConsumer.as_asgi())
- ]
复制代码
然后,在ChatConsumer类中,您需要将websocket_name参数传递给WebsocketConsumer的构造函数。修改后的代码如下:
- class ChatConsumer(WebsocketConsumer):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.websocket_name = self.scope['url_route']['kwargs']['websocket_name']
- def websocket_connect(self, message):
- print(f"连接已建立:{self.websocket_name}")
- self.accept()
- def websocket_receive(self, message):
- self.send("不要回复不要回复")
- def websocket_disconnect(self, message):
- print(f"断开连接:{self.websocket_name}")
- raise StopConsumer
复制代码
请注意,修改后的代码将websocket_name参数从URL中提取出来,并将其存储为ChatConsumer对象的一个属性。在websocket_connect和websocket_disconnect方法中,我们使用该属性来显示连接建立和断开的Websocket名称。