【问题标题】:django-websocket-redis redis connection using unix socketdjango-websocket-redis 使用 unix 套接字的 redis 连接
【发布时间】:2017-01-18 21:55:42
【问题描述】:

我正在使用 django-websocket-redis 并在我的 settings.py 中有这个:

WS4REDIS_CONNECTION = {
    'host': 'unix://var/run/redis/redis.sock',
    'db': 0,
    # 'port': 16379,
    # 'password': 'verysecret',
}

我尝试了所有可能的“主机”参数组合,但无法使用 unix 套接字而不是 tcp 进行连接。我总是收到这条消息:

ConnectionError: Error -2 connecting to /var/run/redis/redis.sock:6379. Name or service not known.

有没有办法使用 unix socket 将 ws4redis 从 django 连接到 redis?如果有,怎么做?

【问题讨论】:

  • 您是否尝试过 ip (127.0.0.1) 或带有单斜杠的主机 unix:/var/run/redis/redis.sock。 Redis 正在侦听端口 6379/var/run/redis 目录中的套接字上也非常重要
  • 尝试确保redis已启动并运行。 ps aux | grep redis
  • 是的。我尝试了命名套接字的所有组合。 redis 通过 tcp 工作,并使用 socket 与其他应用程序一起工作。

标签: python django websocket redis


【解决方案1】:

TL;DR:你必须覆盖ws4redis的默认Redis连接设置

我在实现自定义 Django 命令时遇到了这个问题,该命令应该在某些服务器端事件上发送 websocket 消息。

如果您查看RedisPublisher 类的源代码,您会注意到最顶部的这一行:

redis_connection_pool = ConnectionPool(**settings.WS4REDIS_CONNECTION)

ConnectionPool.__init__() 的 cmets 状态如下:

默认情况下,创建 TCP 连接 connection_class 已指定。 对 unix 套接字使用 redis.UnixDomainSocketConnection

因此,当您实例化RedisPublisher 时,它使用ConnectionPool,默认情况下,它对套接字一无所知。因此有两种方法是可能的:

  1. ConnectionPool 实例化中将默认Connection 切换为UnixDomainSocketConnection
  2. ConnectionPool 替换为StrictRedis 连接,该连接具有使用unix 套接字的内置功能(命名参数unix_socket_path)。

这就是我使用第二种方法解决它的方法(对我来说它看起来更干净):

from redis import StrictRedis
from django.conf import settings
from ws4redis.publisher import RedisPublisher
from ws4redis.redis_store import RedisMessage

r = StrictRedis(**settings.WS4REDIS_CONNECTION)
publisher = RedisPublisher(facility='foobar', broadcast=True)
publisher._connection = r
msg = RedisMessage('ping')
publisher.publish_message(msg)

整个魔法在publisher._connection 行中,它最终切换连接,由RedisPublisher 类使用。 由于_connection 假定访问受保护,这看起来有点脏,但可行的解决方案。

您还需要指定以下WS4REDIS_CONNECTION 设置:

WS4REDIS_CONNECTION = {
    'unix_socket_path': '/tmp/redis.sock'
}

这是 wsgi 所必需的,因为它似乎使用内置的 redis.py 功能来连接到 unix 套接字,如 docs 中所述

【讨论】:

  • 来自similar questions 我会说在何时以及如何使用连接池方面存在混淆。在这种情况下,我会说应该将使用连接与连接池的选项提取到配置中。
  • Github 中有对应的issue
  • 其实PR这个功能最近被合并了。
猜你喜欢
  • 1970-01-01
  • 2015-01-12
  • 2015-02-06
  • 2022-06-16
  • 2019-02-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 2017-11-26
相关资源
最近更新 更多