Javascript Django通道WebSocket参数

Javascript Django通道WebSocket参数,javascript,django,websocket,django-channels,Javascript,Django,Websocket,Django Channels,我正在尝试《Django逐例》一书第13章中的一个例子。这里有一个示例,演示了如何稍后为聊天室建立套接字。下面是我确信错误来自的代码: room.html {% extends "base.html" %} {% block title %}Chat room for "{{ course.title }}"{% endblock %} {% block content %} <div id="chat"> &l

我正在尝试《Django逐例》一书第13章中的一个例子。这里有一个示例,演示了如何稍后为聊天室建立套接字。下面是我确信错误来自的代码:

room.html

{% extends "base.html" %}

{% block title %}Chat room for "{{ course.title }}"{% endblock %}

{% block content %}
  <div id="chat">
  </div>
  <div id="chat-input">
    <input id="chat-message-input" type="text">
    <input id="chat-message-submit" type="submit" value="Send">
  </div>
{% endblock %}

{% block domready %}
  var url = 'ws://' + window.location.host + '/ws/chat/room/' + '{{ course.id }}/';
  var chatSocket = new WebSocket(url);
{% endblock %}
consumer.py

导入json
从channels.generic.websocket导入异步WebsocketConsumer
类ChatConsumer(AsyncWebsocketConsumer):
def连接(自):
self.accept()
def断开连接(自身、关闭_代码):
通过
#从WebSocket接收消息
def接收(自身、文本数据):
text\u data\u json=json.load(text\u数据)
message=text\u data\u json['message']
self.send(text_data=json.dumps({'message':message}))
下面是我在运行
python manage.py runserver
时收到的错误消息:

WebSocket HANDSHAKING /ws/chat/room/6/ [127.0.0.1:57288]
Exception inside application: object.__init__() takes exactly one argument (the instance to initialize)
Traceback (most recent call last):
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/channels/staticfiles.py", line 44, in __call__
    return await self.application(scope, receive, send)
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/channels/routing.py", line 71, in __call__
    return await application(scope, receive, send)
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/channels/sessions.py", line 47, in __call__
    return await self.inner(dict(scope, cookies=cookies), receive, send)
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/channels/sessions.py", line 254, in __call__
    return await self.inner(wrapper.scope, receive, wrapper.send)
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/channels/auth.py", line 181, in __call__
    return await super().__call__(scope, receive, send)
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/channels/middleware.py", line 26, in __call__
    return await self.inner(scope, receive, send)
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/channels/routing.py", line 150, in __call__
    return await application(
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/asgiref/compatibility.py", line 33, in new_application
    instance = application(scope)
  File "/home/xxx/.local/share/virtualenvs/chat-ayPz2iC9/lib/python3.8/site-packages/channels/generic/websocket.py", line 159, in __init__
    super().__init__(*args, **kwargs)
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
当我在模板
room.html
中的块代码
{%block domready%}
中包含这两行时,就会发生此错误。如果没有这两行,websocket握手就不会发生,因此也不会出现错误

从错误中可以看出,套接字实例化只要求一个参数。但是代码
newwebsocket(url)
似乎给出了一个参数。有人知道有什么东西不见了吗? 谢谢

在@Iain Shevington之后更新:

下面是添加后的新错误消息

websocket_urlpatterns = [
    re_path(r'ws/chat/room/(?P<course_id>\d+)/$', consumers.ChatConsumer.as_asgi()),
]

当您将消费者传递到
websocket\u urlpatterns

websocket_urlpatterns = [
    re_path(r'ws/chat/room/(?P<course_id>\d+)/$', consumers.ChatConsumer.as_asgi()),
]

当您将消费者传递到
websocket\u urlpatterns

websocket_urlpatterns = [
    re_path(r'ws/chat/room/(?P<course_id>\d+)/$', consumers.ChatConsumer.as_asgi()),
]

谢谢你的建议。在包含
as\u asgi()
调用后,我收到了一条新的错误消息(已更新)。我还缺什么吗?看起来JavaScript中存在一些
async wait
问题。@TristanTran我认为您的问题在于您有一个异步使用者,但您的方法没有定义为协同路由,我已经添加了一个示例,说明您的使用者可能应该是什么样子的感谢您的建议。在包含
as\u asgi()
调用后,我收到了一条新的错误消息(已更新)。我还缺什么吗?看起来JavaScript中存在一些
async wait
问题。@TristanTran我认为您的问题在于您有一个异步使用者,但您的方法没有定义为协同路由,我已经添加了一个示例,说明您的使用者应该是什么样子的
class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()

    # receive message from WebSocket
    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        await self.send(text_data=json.dumps({'message': message}))