我开始为一个学校项目学习 Django,并且正在使用 websocket 服务器做一个聊天项目,但是当重新加载应用程序时,即使我没有在任何地方调用decode(),我也会收到此错误。我正在将 Django Channels 与 Daphne 一起使用。
这是我的消费者.py
from channels.generic.websocket import WebsocketConsumer
class ChatConsumer(WebsocketConsumer):
def connect(self):
self.accept()
def disconnect(self, code):
pass
这是我的routing.py
from django.urls import path
from . import consumers
websocket_urlpatterns = [
# path('chat/', consumers.ChatConsumer.as_asgi())
path('chat/', consumers.ChatConsumer.as_asgi())
]
这是我的asgi.py
import chat.routing
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django_channels_jwt_auth_middleware.auth import JWTAuthMiddlewareStack
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
application = ProtocolTypeRouter({
'http': get_asgi_application(),
'websocket': AllowedHostsOriginValidator(
JWTAuthMiddlewareStack(
URLRouter(chat.routing.websocket_urlpatterns)
)
)
})
我收到了这个回溯
WebSocket HANDSHAKING /chat/ [127.0.0.1:49878]
WebSocket CONNECT /chat/ [127.0.0.1:49878]
Exception inside application: 'set' object has no attribute 'decode'
Traceback (most recent call last):
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/django/contrib/staticfiles/handlers.py", line 101, in __call__
return await self.application(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/routing.py", line 62, in __call__
return await application(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/security/websocket.py", line 37, in __call__
return await self.application(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/django_channels_jwt_auth_middleware/auth.py", line 36, in __call__
return await self.app(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/sessions.py", line 47, in __call__
return await self.inner(dict(scope, cookies=cookies), receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/sessions.py", line 263, in __call__
return await self.inner(wrapper.scope, receive, wrapper.send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/auth.py", line 185, in __call__
return await super().__call__(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/middleware.py", line 24, in __call__
return await self.inner(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/routing.py", line 116, in __call__
return await application(
^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/consumer.py", line 94, in app
return await consumer(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/consumer.py", line 58, in __call__
await await_many_dispatch(
File "/Users/macbook/programacao/pap/env/lib/python3.12/site-packages/channels/utils.py", line 57, in await_many_dispatch
await task
AttributeError: 'set' object has no attribute 'decode'
WebSocket DISCONNECT /chat/ [127.0.0.1:49878]
在你的settings.py中,添加这段代码:
CHANNEL_LAYERS={
'default': {
'BACKEND':'channels_redis.core.RedisChannelLayer',
'CONFIG':{
'hosts': [('localhost', 6379)],
}
},
}
此外,请确保您的 Redis 正常运行。