Django-Channels 在给出名称或服务未知错误时失败

标签 django django-channels

我有一个相当简单的 django-channels/daphne/asgi/redis 应用程序。该应用程序在使用 chrome 时从来没有任何问题,但在我们使用 firefox(最新版本 ~ 60)时却惨遭失败。我目前有以下错误:

api_1        | 2018-06-12 16:02:24,378 INFO     In the connect method
api_1        | xxxxxx:41647 - - [12/Jun/2018:16:02:24] "WSCONNECT /updates/" - -
api_1        | 2018-06-12 16:02:25,049 ERROR    Exception inside application: [Errno -2] Name or service not known
api_1        |   File "/usr/local/lib/python3.6/site-packages/channels/consumer.py", line 54, in __call__
api_1        |     await await_many_dispatch([receive, self.channel_receive], self.dispatch)
api_1        |   File "/usr/local/lib/python3.6/site-packages/channels/utils.py", line 48, in await_many_dispatch
api_1        |     await dispatch(result)
api_1        |   File "/usr/local/lib/python3.6/site-packages/asgiref/sync.py", line 110, in __call__
api_1        |     return await asyncio.wait_for(future, timeout=None)
api_1        |   File "/usr/local/lib/python3.6/asyncio/tasks.py", line 339, in wait_for
api_1        |     return (yield from fut)
api_1        |   File "/usr/local/lib/python3.6/concurrent/futures/thread.py", line 56, in run
api_1        |     result = self.fn(*self.args, **self.kwargs)
api_1        |   File "/usr/local/lib/python3.6/site-packages/channels/db.py", line 13, in thread_handler
api_1        |     return super().thread_handler(loop, *args, **kwargs)
api_1        |   File "/usr/local/lib/python3.6/site-packages/asgiref/sync.py", line 125, in thread_handler
api_1        |     return self.func(*args, **kwargs)
api_1        |   File "/usr/local/lib/python3.6/site-packages/channels/consumer.py", line 99, in dispatch
api_1        |     handler(message)
api_1        |   File "/usr/local/lib/python3.6/site-packages/channels/generic/websocket.py", line 19, in websocket_connect
api_1        |     self.connect()
api_1        |   File "./flypoll/consumers.py", line 146, in connect
api_1        |     async_to_sync(self.channel_layer.group_add)("flypoll_socket_clients", self.channel_name)
api_1        |   File "/usr/local/lib/python3.6/site-packages/asgiref/sync.py", line 64, in __call__
api_1        |     return call_result.result()
api_1        |   File "/usr/local/lib/python3.6/concurrent/futures/_base.py", line 432, in result
api_1        |     return self.__get_result()
api_1        |   File "/usr/local/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
api_1        |     raise self._exception
api_1        |   File "/usr/local/lib/python3.6/site-packages/asgiref/sync.py", line 78, in main_wrap
api_1        |     result = await self.awaitable(*args, **kwargs)
api_1        |   File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 283, in group_add
api_1        |     async with self.connection(self.consistent_hash(group)) as connection:
api_1        |   File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 403, in __aenter__
api_1        |     self.conn = await aioredis.create_redis(**self.kwargs)
api_1        |   File "/usr/local/lib/python3.6/site-packages/aioredis/commands/__init__.py", line 174, in create_redis
api_1        |     loop=loop)
api_1        |   File "/usr/local/lib/python3.6/site-packages/aioredis/connection.py", line 107, in create_connection
api_1        |     timeout, loop=loop)
api_1        |   File "/usr/local/lib/python3.6/asyncio/tasks.py", line 339, in wait_for
api_1        |     return (yield from fut)
api_1        |   File "/usr/local/lib/python3.6/site-packages/aioredis/stream.py", line 19, in open_connection
api_1        |     lambda: protocol, host, port, **kwds)
api_1        |   File "/usr/local/lib/python3.6/asyncio/base_events.py", line 734, in create_connection
api_1        |     infos = f1.result()
api_1        |   File "/usr/local/lib/python3.6/concurrent/futures/thread.py", line 56, in run
api_1        |     result = self.fn(*self.args, **self.kwargs)
api_1        |   File "/usr/local/lib/python3.6/socket.py", line 745, in getaddrinfo
api_1        |     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
api_1        |   [Errno -2] Name or service not known

说connect方法有问题,但是connect方法是这样的:

def connect(self):
        """
            standard connect handler, accepts the connection, and sets up some basic parameters
            :return:
        """
        logging.info("In the connect method")
        self.accept()
        async_to_sync(self.channel_layer.group_add)("flypoll_socket_clients", self.channel_name)

该应用程序已 dockerized 并托管在 ec2 上。 redis、python、django 也已 dockerized。我已经将模块(asgiref、txaio、twisted、channels、daphne 等)更新到最新版本,但我无法摆脱它。

有什么问题吗?

最佳答案

看起来你的django容器无法访问redis。

在你的 django 设置中你必须有这样的东西:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [('[redis-host-here]', 6379)],  # REPLACE redis host here
        },
    },
}

并且该主机必须可以从您的 django 容器访问

关于Django-Channels 在给出名称或服务未知错误时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51062707/

相关文章:

django - 使用 token 身份验证时如何在 django channel 中的 websocket 连接中对用户进行身份验证

django - 如何使用 django 创建视频缩略图?

python - Django python manage.py 迁移

django - 自定义 django-storage s3 url?

django - 如何在生产 Pythonanywhere 中运行 WebSocket (django-channels)?

django - 如何在消费者、django channel 2 中创建连续发送数据并安全断开连接的任务?

python - Django ORM : Joining QuerySets

python - 如何在 Django 中将列表从一个 View 传递到另一个 View ?

django - Redis 在 Django Channels 中起到什么作用

django - 启动 django 服务器时,我不断收到 NotImplementedError 错误