【问题标题】:TypeError: HomeConsumer() takes no argumentsTypeError: HomeConsumer() 没有参数
【发布时间】:2020-11-23 06:03:03
【问题描述】:

我正在使用 django 处理频道,并且我有 2 个不同的消费者用于 2 个不同的网页,但是在执行网页时我收到消费者的类型错误

这是 consumer.py 文件

from channels.consumer import AsyncConsumer
    import asyncio
    
    
    class ChatConsumer(AsyncConsumer):
    
        async def websocket_connect(self,event):
    
            await self.send(
                {
                    'type':'websocket.accept',
                }
            )
            print("connected",event)
    
        async def websocket_receive(self,event):
            print("received",event)
    
        async def websocket_disconnect(self,event):
            print("disconnected",event)

        

    class HomeConsumer(AsyncConsumer):
    
        async def websocket_connect(self,event):
    
            await self.send(
                {
                    'type':'websocket.accept',
                }
            )
            print("connected",event)
    
        async def websocket_receive(self,event):
            print("received",event)
    
        async def websocket_disconnect(self,event):
            print("disconnected",event)

这是我的 routing.py 文件

import os
from channels.routing import ProtocolTypeRouter,URLRouter
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
from django.urls import re_path 
from .consumer import ChatConsumer,HomeConsumer
from django.conf.urls import url


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

application = ProtocolTypeRouter({

    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                   url(r"^profile/(?P<username>[\w.@+-]+)",ChatConsumer), 
                   url("profile",HomeConsumer)
                ]
            )
        )
    )
    
    
})

这是我的 websocket javascript:

var loc = window.location
console.log(loc)

var endpoint = "ws://" + loc.host + loc.pathname

var socket = new WebSocket(endpoint)

socket.onmessage = function(e) {
    console.log("message", e)
}

socket.onopen = function(e) {
    console.log("open", e)
}

socket.onclose = function(e) {
    console.log("close", e)
}

socket.onerror = function(e) {
    console.log("error", e)
}

这是我的 urls.py 文件:

from django.contrib import admin
from django.urls import path,include
from connectedfour.views import home,game,profile

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',home,name='home'),
    path('profile',profile,name='profile'),
    path('accounts/',include('accounts.urls')),
    path('profile/<username>',game,name='game')
]

我收到这样的错误:

HTTP GET /profile 200 [0.03, 127.0.0.1:50706]
WebSocket HANDSHAKING /profile [127.0.0.1:50708]
Exception inside application: HomeConsumer() takes no arguments
Traceback (most recent call last):
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/channels/staticfiles.py", line 44, in __call__
    return await self.application(scope, receive, send)
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/channels/routing.py", line 71, in __call__
    return await application(scope, receive, send)
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/channels/security/websocket.py", line 37, in __call__
    return await self.application(scope, send, receive)
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/channels/sessions.py", line 47, in __call__
    return await self.inner(dict(scope, cookies=cookies), receive, send)
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/channels/sessions.py", line 254, in __call__
    return await self.inner(wrapper.scope, receive, wrapper.send)
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/channels/auth.py", line 181, in __call__
    return await super().__call__(scope, receive, send)
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/channels/middleware.py", line 26, in __call__
    return await self.inner(scope, receive, send)
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/channels/routing.py", line 150, in __call__
    return await application(
  File "/home/rusker/Desktop/Pydjango/tenv/lib/python3.8/site-packages/asgiref/compatibility.py", line 33, in new_application
    instance = application(scope)
TypeError: HomeConsumer() takes no arguments
WebSocket DISCONNECT /profile [127.0.0.1:50708]

【问题讨论】:

    标签: javascript python django django-channels


    【解决方案1】:

    尝试将圆括号放在视图参数中以指定没有参数的类,例如url("profile",HomeConsumer())

    【讨论】:

      【解决方案2】:

      您应该从 HomeConsumer 类中删除 AsyncConsumer

      【讨论】:

        【解决方案3】:

        我认为在最近的频道版本中,您应该像这样编写 url 模式。

        url("profile", HomeConsumer.as_asgi())
        

        就像您在为普通的基于类的视图编写 url 模式时拥有“.as_view()”一样,因为 HomeConsumer 也类似于基于类的视图。

        【讨论】:

          【解决方案4】:

          我通过使用 Asgi.py 解决了这个问题,它与 routing.py 的设置几乎相同,但略有变化, 我参考了这篇文章: https://channels.readthedocs.io/en/stable/installation.html (我用的是Django2.2版本的代码)

          同样重要的是你让你的 Asgi 处理程序像这样:

          应用程序 = ProtocolTypeRouter({ "http": AsgiHandler(), 'websocket': AuthMiddlewareStack( 网址路由器( [ url(r"^auction/(?P[-\w]+)$", AuctionConsumer.as_asgi()), ] ) )

          })

          我希望这对任何人都有帮助,因为我挣扎了很长时间才找到解决方案。

          【讨论】:

            猜你喜欢
            • 2021-06-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-16
            相关资源
            最近更新 更多