TL; DR: Sie müssen Standard Redis Verbindungseinstellungen außer Kraft setzen ws4redis
ich in diesen gestoßen habe, wenn ich benutzerdefinierten Django Befehl wurde die Umsetzung, die angeblich eine websocket Nachricht über bestimmte server- schicken Nebenereignisse.
Wenn Sie sich den Quellcode von RedisPublisher
Klasse betrachten, werden Sie diese Zeile bemerken an der Spitze:
redis_connection_pool = ConnectionPool(**settings.WS4REDIS_CONNECTION)
während Kommentare für ConnectionPool.__init__()
Zustand nach:
standardmäßig TCP-Verbindungen werden erstellt. Verbindungsklasse ist angegeben. Verwenden Sie redis.UnixDomainSocketConnection
für Unix-Sockets. So
wenn Sie RedisPublisher
Instanziierung verwendet es ConnectionPool
die standardmäßig nicht weiß nichts über Sockets. Daher 2 Ansätze möglich:
- Schalter Standard
Connection
zu UnixDomainSocketConnection
in ConnectionPool
Instanziierung oder
- Ersatz
ConnectionPool
mit StrictRedis
Verbindung, die Fähigkeiten hat eingebaute Unix-Socket zu verwenden (mit dem Namen Argument unix_socket_path
).
Dies ist, wie ich es zweiten Ansatz (es erscheint Reiniger für mich) unter Verwendung gelöst:
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)
Die ganze Magie ist in publisher._connection
Linie, die letztlich Verbindungsschalter, durch RedisPublisher
Klasse verwendet. Da _connection
geschützten Zugriff annimmt, sieht dies wie eine etwas schmutzige, aber funktionierende Lösung aus.
Sie müssen auch folgende WS4REDIS_CONNECTION
Einstellungen angeben:
WS4REDIS_CONNECTION = {
'unix_socket_path': '/tmp/redis.sock'
}
Dies ist für wsgi erforderlich, da es scheint, built-in verwenden redis.py
Fähigkeit zu Unix-Socket zu verbinden, wie es in docs
angegeben haben Sie haben versucht, ip ('127.0.0.1') oder Host mit einem einzelnen Schrägstrich' unix:/var/run/redis/redis.sock' zu betreiben. Alse veryfi, dass redis am Port '6379' oder am Socket im Verzeichnis'/var/run/redis 'lauscht – Dawid
Versuchen Sie sicherzustellen, dass das Redis gestartet und gestartet wird.'ps aux | grep redis ' –
Ja. Ich habe alle Kombinationen der Benennung des Sockels ausprobiert. Und Redis funktioniert über TCP und funktioniert mit Socket mit anderen Anwendungen. –