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

Django Channels WebSocket运行报错:'int'对象无decode属性

Django WebSocket 连接报错:'int' object has no attribute 'decode'

环境版本

  • Python 3.9.10
  • Django 4.1.2
  • Channels 4.0.0
  • Daphne 4.0.0

报错信息

HTTP GET /chat/hello/ 200 [0.01, 127.0.0.1:65009]
WebSocket HANDSHAKING /ws/chat/hello/ [127.0.0.1:65014]
Exception inside application: 'int' object has no attribute 'decode'
Traceback (most recent call last):
  File "D:\Projects\New Backend\venv\lib\site-packages\django\contrib\staticfiles\handlers.py", line 101, in __call__
    return await self.application(scope, receive, send)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\routing.py", line 62, in __call__
    return await application(scope, receive, send)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\sessions.py", line 47, in __call__
    return await self.inner(dict(scope, cookies=cookies), receive, send)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\sessions.py", line 263, in __call__
    return await self.inner(wrapper.scope, receive, wrapper.send)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\auth.py", line 185, in __call__
    return await super().__call__(scope, receive, send)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\middleware.py", line 24, in __call__
    return await self.inner(scope, receive, send)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\routing.py", line 116, in __call__
    return await application(
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\consumer.py", line 94, in app
    return await consumer(scope, receive, send)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\consumer.py", line 58, in __call__
    await await_many_dispatch(
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\utils.py", line 57, in await_many_dispatch
    await task
  File "D:\Projects\New Backend\venv\lib\site-packages\channels\utils.py", line 49, in await_many_dispatch
    result = task.result()
  File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 367, in receive
    message_channel, message = await self.receive_single(
  File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 422, in receive_single
    content = await self._brpop_with_clean(
  File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 255, in _brpop_with_clean
    connection = self.connection(index)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 738, in connection
    self.pools[index] = self.create_pool(index)
  File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 133, in create_pool
    return aioredis.ConnectionPool.from_url(host["address"])
  File "D:\Projects\New Backend\venv\lib\site-packages\redis\asyncio\connection.py", line 1284, in from_url
    url_options = parse_url(url)
  File "D:\Projects\New Backend\venv\lib\site-packages\redis\asyncio\connection.py", line 1176, in parse_url
    parsed: ParseResult = urlparse(url)
  File "C:\Users\luixg\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py", line 392, in urlparse
    url, scheme, _coerce_result = _coerce_args(url, scheme)
  File "C:\Users\luixg\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py", line 128, in _coerce_args
    return _decode_args(args) + (_encode_result,)
  File "C:\Users\luixg\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py", line 112, in _decode_args
    return tuple(x.decode(encoding, errors) if x else '' for x in args)
  File "C:\Users\luixg\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py", line 112, in <genexpr>
    return tuple(x.decode(encoding, errors) if x else '' for x in args)
AttributeError: 'int' object has no attribute 'decode'
WebSocket DISCONNECT /ws/chat/hello/ [127.0.0.1:65014]

问题分析

报错源于channels_redis解析Redis连接地址时,传入了整数类型的值(通常是端口号),而urllib.parse模块试图对该整数调用decode方法触发属性错误。这几乎都是**CHANNEL_LAYERS配置格式错误**导致的,常见情况是将Redis地址的端口号单独以整数形式传入,而非符合要求的格式。

解决方案

1. 修正CHANNEL_LAYERS配置

打开项目settings.py,找到CHANNEL_LAYERS配置项,按以下正确格式修改:

方案一:使用元组格式(推荐,避免URL解析问题)

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("localhost", 6379)],  # 元组格式:(主机字符串, 端口整数)
        },
    },
}

方案二:使用完整Redis URL字符串

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": ["redis://localhost:6379/0"],  # 完整URL字符串
        },
    },
}

注意:不要使用{"address": 6379}这类仅传端口整数的格式,必须传入完整主机地址或URL。

2. 确保依赖版本兼容

Channels 4.0.0需要搭配channels_redis>=4.0.0,执行以下命令更新依赖:

pip install --upgrade channels_redis

3. 检查Redis服务状态

确认本地Redis服务已启动,且端口6379可正常访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:12:21