gpt4 book ai didi

python - django-websocket-redis 使用 unix socket 连接 redis

转载 作者:IT王子 更新时间:2023-10-29 06:13:54 28 4
gpt4 key购买 nike

我正在使用 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 套接字将 ws4redis 从 django 连接到 redis?如果有,怎么办?

最佳答案

TL;DR:您必须覆盖 ws4redis

的默认 Redis 连接设置

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

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

redis_connection_pool = ConnectionPool(**settings.WS4REDIS_CONNECTION)

ConnectionPool.__init__() 的注释说明如下:

By default, TCP connections are created connection_class is specified. Use redis.UnixDomainSocketConnection for unix sockets.

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

  1. ConnectionPool 实例化或
  2. 中将默认的 Connection 切换为 UnixDomainSocketConnection
  3. 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 假定访问 protected ,这看起来有点脏,但可行的解决方案。

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

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

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

关于python - django-websocket-redis 使用 unix socket 连接 redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41705774/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com