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

