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

运行Django服务器报错:channels.consumer模块未找到

问题:启动Django服务器失败(migrate执行正常)

我无法通过python manage.py runserver启动Django服务器,但python manage.py migrate能正常执行。尝试将ASGI_APPLICATION = "MyProject.asgi.application"修改为ASGI_APPLICATION = "routing.application",问题仍未解决。

报错信息

show_sunset_warning()
System check identified no issues (0 silenced).
March 29, 2025 - 17:52:24
Django version 5.1.7, using settings 'MyProject.settings'
Starting ASGI/Daphne version 4.1.2 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/home/corey-james/Arborhub/MyProject/venv/lib/python3.12/site-packages/daphne/management/commands/runserver.py", line 29, in get_default_application
    module = importlib.import_module(path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 995, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/home/corey-james/Arborhub/MyProject/MyProject/asgi.py", line 12, in <module>
    import arborchat.routing
  File "/home/corey-james/Arborhub/MyProject/arborchat/routing.py", line 3, in <module>
    from . import consumers
  File "/home/corey-james/Arborhub/MyProject/arborchat/consumers.py", line 2, in <module>
    from channels.consumer import AsyncConsumer
ModuleNotFoundError: No module named 'channels.consumer'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.12/threading.py", line 1075, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.12/threading.py", line 1012, in run
    self._target(*self._args, **self._kwargs)
  File "/home/corey-james/Arborhub/MyProject/venv/lib/python3.12/site-packages/django/utils/autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "/home/corey-james/Arborhub/MyProject/venv/lib/python3.12/site-packages/daphne/management/commands/runserver.py", line 128, in inner_run
    application=self.get_application(options),
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/corey-james/Arborhub/MyProject/venv/lib/python3.12/site-packages/daphne/management/commands/runserver.py", line 153, in get_application
    return ASGIStaticFilesHandler(get_default_application())
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/corey-james/Arborhub/MyProject/venv/lib/python3.12/site-packages/daphne/management/commands/runserver.py", line 31, in get_default_application
    raise ImproperlyConfigured("Cannot import ASGI_APPLICATION module %r" % path)
django.core.exceptions.ImproperlyConfigured: Cannot import ASGI_APPLICATION module 'MyProject.asgi'

我的consumers.py代码

import json
from channels.consumer import AsyncConsumer

from channels.generic.websocket import AsyncJsonWebsocketConsumer
import base64


# Channel consumer for both chat room group

class ChatConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'chat_%s' % self.room_name
        
        # Join room group
        await self.channel_layer.group_add(self.room_group_name, self.channel_name)
        
        await self.accept()
        
        
    async def disconnect(self, close_code):

        # Leave room group
        await self.channel_layer.group_discard(self.room_group_name, self.channel_layer)
        
    # Receive message from WebSocket
    
    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        
        # Send message to room group
        await self.channel_layer.group_send(
            self.room_group_name, {'type': 'chat.message', 'message': message}
        )
        
    # Receive message from room group
    
    async def re(self, event):
        message = event['message']
        
        # send message to websocket
        await self.send(text_data=json.dumps({'message': message}))
        
        
# Channel Consumer that consumed events for uploading/receiving image files in the message room

class UploadImageConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        await self.accept()
        

    async def disconnect(self, close_code):

        async def receive(self, bytes_data=None, text_data=None):
            if bytes_data:
            # Handles image file chunks (binary data)
            
                with open('image.jpg', 'rb') as f:
                    fcontent = f.read()
                await self.send(base64.b64encode(fcontent).decode('utf-8'))
            elif text_data:
                # Handles metadata (text data)
            
                await self.send(text_data=json.dumps({'message': text_data}))
            
            
    async def send_image(self, event):
        image_data = event['image_text']
        await self.send(bytes_data=image_data)

解决方案

1. 修复导入路径错误

报错核心是ModuleNotFoundError: No module named 'channels.consumer',Channels的正确导入路径是复数形式channels.consumers,而非单数channels.consumer。

另外你的代码中并没有实际用到AsyncConsumer(两个消费者都继承自AsyncJsonWebsocketConsumer),可以直接删除这行无用导入:

# 删除此行
from channels.consumer import AsyncConsumer

2. 修正ChatConsumer中的错误

  • disconnect方法参数错误:group_discard的第二个参数应该是当前消费者的channel_name,而非channel_layer,修正为:
    async def disconnect(self, close_code):
        # Leave room group
        await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
    
  • 组消息接收方法名不匹配:group_send中指定的type是chat.message,对应的消费者方法名需要将点替换为下划线,即chat_message,而非re,修正为:
    # Receive message from room group
    async def chat_message(self, event):
        message = event['message']
        # send message to websocket
        await self.send(text_data=json.dumps({'message': message}))
    

3. 修复UploadImageConsumer的嵌套方法错误

你将receive方法嵌套在了disconnect方法内部,这会导致方法无法被正确调用,需要将receive方法移到类的顶层,与connect、disconnect同级:

class UploadImageConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        await self.accept()
        
    async def disconnect(self, close_code):
        # 可添加断开连接的清理逻辑,不需要则留空
        pass
        
    async def receive(self, bytes_data=None, text_data=None):
        if bytes_data:
            # Handles image file chunks (binary data)
            with open('image.jpg', 'rb') as f:
                fcontent = f.read()
            await self.send(base64.b64encode(fcontent).decode('utf-8'))
        elif text_data:
            # Handles metadata (text data)
            await self.send(text_data=json.dumps({'message': text_data}))
            
    async def send_image(self, event):
        image_data = event['image_text']
        await self.send(bytes_data=image_data)

4. 恢复ASGI配置(可选)

如果你的项目是标准Django Channels结构,建议将ASGI_APPLICATION恢复为默认值:

ASGI_APPLICATION = "MyProject.asgi.application"

确保asgi.py正确导入Channels路由,示例如下:

import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
import arborchat.routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyProject.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": URLRouter(
        arborchat.routing.websocket_urlpatterns
    ),
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:41:01