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
相关产品推荐
相关产品推荐

