2017-01-17 3 views
1

Ich bin mit django-WebSocket-redis und haben dies in meinem settings.py:django-WebSocket-redis redis Verbindung mit Unix-Socket

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

ich alle möglichen Kombinationen von 'host' Parameter versucht und kann Erreiche es nicht mit tcp, sondern mit Unix Socket. Ich bekomme immer diese Meldung:

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

Gibt es eine Möglichkeit ws4redis von django zu verbinden Unix-Socket Redis mit? Wenn ja, wie?

+2

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

+0

Versuchen Sie sicherzustellen, dass das Redis gestartet und gestartet wird.'ps aux | grep redis ' –

+0

Ja. Ich habe alle Kombinationen der Benennung des Sockels ausprobiert. Und Redis funktioniert über TCP und funktioniert mit Socket mit anderen Anwendungen. –

Antwort

1

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:

  1. Schalter Standard Connection zu UnixDomainSocketConnection in ConnectionPool Instanziierung oder
  2. 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

+0

Aus den [ähnliche Fragen] (http://stackoverflow.com/questions/35317081/redis-py-when-to-use-connection-pool) würde ich sagen, es gibt eine Verwirrung darüber, wann und wie Verbindungspools zu verwenden. In diesem Fall würde ich sagen, dass die Option zur Verwendung von Verbindung vs Verbindungspool in die Konfiguration extrahiert werden sollte. – paulus

+0

Es gibt ein entsprechendes [Problem] (https://github.com/jrief/django-websocket-redis/issues/212) in Github – paulus

+0

Vielen Dank für die ausführliche Erklärung. Ich werde es morgen umsetzen. –

Verwandte Themen