You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Channels聊天项目报错:'set' object has no attribute 'decode'

Django Channels + Daphne 聊天项目出现 AttributeError: 'set' object has no attribute 'decode'

问题场景

开发学校Django聊天项目,使用WebSocket(Django Channels + Daphne),重载应用时触发AttributeError: 'set' object has no attribute 'decode',未手动调用decode()方法。

相关代码

consumers.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]

解决方案

从错误栈可定位问题出在django_channels_jwt_auth_middleware中间件,结合Python 3.12版本,大概率是中间件版本不兼容或内部逻辑错误将值转为集合(set)而非字符串,导致decode()调用失败。

具体解决步骤:

  1. 临时移除JWT中间件验证
    注释asgi.py中的JWTAuthMiddlewareStack,直接使用URLRouter,验证错误是否消失:

    application = ProtocolTypeRouter({
        'http': get_asgi_application(),
        'websocket': AllowedHostsOriginValidator(
            # JWTAuthMiddlewareStack(
                URLRouter(chat.routing.websocket_urlpatterns)
            # )
        )
    })
    

    若错误消失,确认问题来自该JWT中间件。

  2. 更新或更换JWT中间件

    • 执行命令更新中间件,查看是否有Python 3.12兼容版本:
      pip install --upgrade django_channels_jwt_auth_middleware
      
    • 若无兼容更新,改用维护更活跃的Channels JWT中间件(如channels-jwt-auth),或自行实现简易JWT验证逻辑。
  3. 检查JWT配置
    确认Django settings中JWT相关配置(如SECRET_KEY、JWT_AUTH参数)是否正确,避免将配置项错误设为集合类型(如用{}替代"")。

  4. 降级Python版本(备选)
    若暂时无兼容中间件,可将Python降级至3.11或更早版本,提升与旧中间件的兼容性。

内容的提问来源于stack exchange,提问作者user23970573

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:33:10