【问题标题】:How to solve the error ImportError: cannot import name 'AsyncWebsocketConsumer'?如何解决错误 ImportError: cannot import name 'AsyncWebsocketConsumer'?
【发布时间】:2018-05-11 05:21:39
【问题描述】:

我正在使用 Python 3.6、Django 1.11 和 chennels=2。 我正在关注本教程,在教程第 2 部分之前它工作正常:http://channels.readthedocs.io/en/stable/tutorial/part_2.html

当我转到教程第 3 部分并相应更改 ChatConsumer 文件时:http://channels.readthedocs.io/en/stable/tutorial/part_3.html

我遇到了这个问题

ImportError: 无法导入名称“AsyncWebsocketConsumer”

Consumer.py:

from channels.generic.websocket import AsyncWebsocketConsumer
import json

class ChatConsumer(AsyncWebsocketConsumer):
    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_name
        )

    # 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 chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'message': message
        }))

错误: 任何一种都将不胜感激!

【问题讨论】:

  • 可以导入WebsocketConsumer吗?
  • 哦,你告诉过教程 2 中的工作查找。我没看到。当你在python manage.py shell 中调用AsyncWebsocketConsuemr 时发生了什么?
  • import channels.layers channel_layer = channels.layers.get_channel_layer() from asgiref.sync import async_to_sync async_to_sync(channel_layer.send)('test_channel', {'type': 'hello'}) async_to_sync( channel_layer.receive)('test_channel') 我在 shell 中遵循了这个,它工作得很好,如教程第 2 部分中所述
  • 我的意思是 from channels.generic.websocket import AsyncWebsocketConsumer 在 shell 中发生了什么?您可以在 shell 中调用 AsyncWebsocketConsume,但不能仅在 consumer.py 中调用?
  • ImportError: cannot import name 'AsyncWebsocketConsumer' 从 django shell 调用时出现同样的错误

标签: python django chat django-channels


【解决方案1】:

更新到频道版本 2.1 并解决了这个错误!

pip install channels==2.1

【讨论】:

    【解决方案2】:

    要将您的使用者函数更改为异步性质,您需要从 channels.generic.websocket 导入 AsyncWebsocketConsumer

    from channels.generic.websocket import AsyncWebsocketConsumer
    

    【讨论】:

    • 你能展示你的consumers.py吗?如果你展示完整的回溯,那就太好了。 ..
    • 本教程是为 Channels 2.0 编写的,它支持 Python 3.5+ 和 Django 1.11+。这在教程中提到,我认为 django 1.11 也支持。
    • 有人认为 django 2 url.py 与 django 1.11 不同,在 Django 1.11 中 url 被用作 url(r'^$', views.index, name='index') 并且在 Django 2 url 为:教程 url 中的 path('admin/', admin.site.urls) 用作 url(r'^$', views.index, name='index')
    • url 未完全弃用,您仍然可以使用 url 和路径。我也检查了 1.11 并且它正在工作。你能告诉我你的pip freeze 输出吗?
    • 教程中使用Django 1.11.10版本如channels.readthedocs.io/en/stable/tutorial/part_1.html
    猜你喜欢
    • 2019-10-25
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多