Получение ошибки socket.gaierror: [Errno 11003] getaddrinfo failed when using Django Channels
Я настраиваю Websockets с помощью Django Channels
, отправляя тестовое сообщение при срабатывании соответствующей конечной точки API. Однако когда я пытаюсь использовать Postman для тестирования моего websocket-соединения, я успешно подключаюсь, получаю JSON, который я отправляю, и сразу же отключаюсь. Вот полный отслеживание:
redis.exceptions.ConnectionError: Error 10061 connecting to localhost:49155. No connection could be made because the target machine actively refused it.
HTTP GET /media/profile/2022/06/10/photo-1615672968435-95ade28e0b38.jpg 500 [4.47, 127.0.0.1:51105]
HTTP GET /users/1/ 500 [4.46, 127.0.0.1:51106]
WebSocket HANDSHAKING /stories/notification_testing/ [127.0.0.1:50570]
{'type': 'websocket', 'path': '/stories/notification_testing/', 'raw_path': b'/stories/notification_testing/', 'headers': [(b'sec-websocket-version', b'13'
), (b'sec-websocket-key', b'TcKbMvNYlHQtJdO5efSXDQ=='), (b'connection', b'Upgrade'), (b'upgrade', b'websocket'), (b'sec-websocket-extensions', b'permessage
-deflate; client_max_window_bits'), (b'host', b'127.0.0.1:8000')], 'query_string': b'', 'client': ['127.0.0.1', 50570], 'server': ['127.0.0.1', 8000], 'sub
protocols': [], 'asgi': {'version': '3.0'}, 'cookies': {}, 'session': <django.utils.functional.LazyObject object at 0x00000207DC59A5E0>, 'user': <channels.auth.UserLazyObject object at 0x00000207D8D5A820>, 'path_remaining': '', 'url_route': {'args': (), 'kwargs': {}}}
WebSocket CONNECT /stories/notification_testing/ [127.0.0.1:50570]
Exception inside application: [Errno 11003] getaddrinfo failed
Traceback (most recent call last):
...
File "C:\Users\15512\Desktop\django-project\peerplatform\signup\consumers.py", line 31, in websocket_connect
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
...
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11003] getaddrinfo failed
WebSocket DISCONNECT /stories/notification_testing/ [127.0.0.1:50570]
Я запускаю Redis через образ Django, я уже использую кэш Redis для различных целей. Вот как я настраиваю свой слой Channels в Settings.py
:
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("default:redispw@127.0.0.1", 49155)],
},
},
}
Это расположение моего экземпляра Redis из Docker
"LOCATION": "redis://default:redispw@localhost:49153",
Я настроил маршрутизатор для моих вебсокетах в asgi.py
:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'signup.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
[path('stories/notification_testing/', NotificationConsumer.as_asgi())]
))
})
Я заметил в трекбеке, что одна из ошибок, похоже, относится к строке 31 в моем файле consumers.py, вот конкретная функция из consumers.py:
class NotificationConsumer(AsyncWebsocketConsumer):
async def websocket_connect(self, event):
print(self.scope)
await self.accept()
await self.send(json.dumps({
"type": "websocket.send",
"text": "hello world"
}))
self.room_name='test_consumer'
self.room_group_name='test_consumer_group'
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
self.send({
"type": "websocket.send",
"text": "room made"
})
На всякий случай, если это тоже актуально, вот мой models.py:
class Notifications(models.Model):
sender = models.ForeignKey(User, null=True, blank=True,
related_name='sender', on_delete=models.CASCADE)
receiver = models.ForeignKey(User, null=True, blank=True,
related_name='receiver', on_delete=models.CASCADE)
status = models.CharField(max_length=264, null=True, blank=True,
default="unread")
type_of_notification = models.CharField(max_length=264, null=True, blank=True)
Что я пробовал?
- После небольшого исследования я попробовал изменить хост на:
redis://default:redispw@localhost, 49153
и получил ту же ошибку .
- Переустановил все
django-channels
&redis-channels
- Временно отключил брандмауэр, чтобы проверить, не в этом ли проблема .
- Я знаю, что раскрываю свой порт и хост, потому что, как я уже говорил, я уже использую экземпляр redis в качестве кэша для хранения и получения данных .
Django-Channels fail while giving name or service unknown error
У меня была такая же проблема. URL Redis был неправильным. После того как я изменил его, все заработало.