Python3提示Exception inside application: object.__init__() takes exactly one argument (the instance to

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

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()加上这个
]

或者判断一下Python的版本来考虑加不加上

在routing.py 中,python 3.6 以上的版本需要“as_asgi()”。

这是我解决问题并不断允许不同版本的方法。

from django.urls import path

from . import consumers

if float(platform.python_version()[0:3]) > 3.6:
    cons = consumers.myConsumer.as_asgi()
else:
    cons = consumers.myConsumer


websocket_urlpatterns = [
    path('ws/dist', cons),####!!!!

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值