admin管理员组

文章数量:1566355

以下解决办法所处于的软件版本有:

Python3+

Django2+

Channel3+

问题场景:

在 Channels 3.0.0 版中,当我尝试通过 websocket 连接到我的 Django Application 时,python 引发异常。来自运行服务器的控制台日志:

November 01, 2021 - 13:18:04
Django version 3.1.2, using settings 'Menu.settings'
Starting ASGI/Channels version 3.0.0 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
WebSocket HANDSHAKING /ws/dist [127.0.0.1:56024]
Exception inside application: object.__init__() takes exactly one argument (the instance to initialize)
Traceback (most recent call last):
  File "/home/nakmak98/source/Menu/pycharm_venv/lib/python3.8/site-packages/channels/routing.py", line 71, in __call__
    return await application(scope, receive, send)
  File "/home/nakmak98/source/Menu/pycharm_venv/lib/python3.8/site-packages/channels/sessions.py", line 47, in __call__
    return await self.inner(dict(scope, cookies=cookies), receive, send)
  File "/home/nakmak98/source/Menu/pycharm_venv/lib/python3.8/site-packages/channels/sessions.py", line 172, in __call__
    return await self.inner(self.scope, receive, self.send)
  File "/home/nakmak98/source/Menu/pycharm_venv/lib/python3.8/site-packages/channels/auth.py", line 181, in __call__
    return await super().__call__(scope, receive, send)
  File "/home/nakmak98/source/Menu/pycharm_venv/lib/python3.8/site-packages/channels/middleware.py", line 26, in __call__
    return await self.inner(scope, receive, send)
  File "/home/nakmak98/source/Menu/pycharm_venv/lib/python3.8/site-packages/channels/routing.py", line 150, in __call__
    return await application(
  File "/home/nakmak98/source/Menu/pycharm_venv/lib/python3.8/site-packages/asgiref/compatibility.py", line 33, in new_application
    instance = application(scope)
  File "/home/nakmak98/source/Menu/pycharm_venv/lib/python3.8/site-packages/channels/generic/websocket.py", line 23, in __init__
    super().__init__(*args, **kwargs)

我的routing.py的代码

from django.urls import path

from . import consumers

websocket_urlpatterns = [
    path('ws/dist', consumers.MealPointConsumer),
]

问题原因:

这个问题主要是在使用Python的channel3版本的时候,routing.py有了重大的更新。

v3 是对 ASGI v3 的一次重大更新,它改变了consumer的sign。

解决办法:

在routing.py中的path调用的时候,加上.as_asgi()即可,比如

from django.urls import path

from . import consumers

websocket_urlpatterns = [
    path('ws/dist', consumers.MealPointConsumer.as_asgi()),####.as_asgi()加上这个
]

 

有关更新的更多详细信息和指南,请参阅 3.0 发行说明:https://channels.readthedocs.io/en/stable/releases/3.0.0.html#update-to-asgi-3

本文标签: 提示applicationExceptionobjectargument