私は django-socketio とのチャットを構築し、それで redis を使用しようとしています。
私は非常に単純な event.py を持っています:
@events.on_message(channel='^channel-')
def messages(request, socket, context, message):
socket.send_and_broadcast_channel(message)
チャットは完璧に機能します。
今、私はredisを実装しようとしています:
@events.on_message(channel='^channel-')
def messages(request, socket, context, message):
r = redis.StrictRedis()
r = r.pubsub()
r.subscribe('chat')
s = redis.Redis()
s.publish('chat', message)
for m in r.listen():
data = m['data']
print data
メッセージは redis チャネルで公開されますが、.listen() を呼び出すと、何も機能しなくなります。.listen() がすべてを「ブロック」しているようです。ctr+C を使用してサーバーをエスケープすることさえできません
どうすればそれを解決できるかについてのアイデアはありますか? ありがとうございました!
編集:
これが私が今持っているものです:
def listener(self):
r = redis.StrictRedis()
r = r.pubsub()
r.subscribe('chat')
for m in r.listen():
message = m['data']
socket.send_and_broadcast_channel(message)
@events.on_message()
def messages(request, socket, context, message):
r = redis.Redis()
r.publish('chat', message)
それでもうまくいきません。
redis が gevent (django-socketio で使用) と連携するには、ユーザーがサブスクライブするときに Greenlet を開始する必要があります。したがって、次のようなものを追加する必要があります。
def on_subscribe(self, *args, **kwargs):
self.spawn(self.listener)
しかし、イベントを使用する必要があることを考えると、django-socketio でそれを行う方法がわかりませんでした
@event.on_connect()
def connect(request, socket, context)
しかし、引数「self」を渡すことはできません。だから私は「self.spawn(self.listener)」を使うことができず、どうすれば違うやり方ができるのかわからない