【发布时间】: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