daphne/channels/backends/redis_py.py
2015-06-10 23:02:53 -07:00

57 lines
1.7 KiB
Python

import time
import json
import datetime
import redis
import uuid
from .base import BaseChannelBackend
class RedisChannelBackend(BaseChannelBackend):
"""
ORM-backed channel environment. For development use only; it will span
multiple processes fine, but it's going to be pretty bad at throughput.
"""
def __init__(self, expiry=60, host="localhost", port=6379, prefix="django-channels:"):
super(RedisChannelBackend, self).__init__(expiry)
self.host = host
self.port = port
self.prefix = prefix
@property
def connection(self):
"""
Returns the correct connection for the current thread.
"""
return redis.Redis(host=self.host, port=self.port)
def send(self, channel, message):
key = uuid.uuid4()
self.connection.set(
key,
json.dumps(message),
ex = self.expiry + 10,
)
self.connection.rpush(
self.prefix + channel,
key,
)
def receive_many(self, channels):
if not channels:
raise ValueError("Cannot receive on empty channel list!")
# Get a message from one of our channels
while True:
result = self.connection.blpop([self.prefix + channel for channel in channels], timeout=1)
if result:
content = self.connection.get(result[1])
if content is None:
continue
return result[0][len(self.prefix):], json.loads(content)
else:
return None, None
def __str__(self):
return "%s(host=%s, port=%s)" % (self.__class__.__name__, self.host, self.port)