以下は、ブラウザにメッセージを送信する簡単なアプリです。redis チャネルからの新しいメッセージがある場合は、それが送信されます。それ以外の場合は、ブロックされていない方法で最後の既知の値が送信されます。しかし、私は何か間違ったことをしています。誰かが私を理解するのを手伝ってくれますか
from gevent import monkey, Greenlet
monkey.patch_all()
from flask import Flask,render_template,request,redirect,url_for,abort,session,Response,jsonify
app = Flask(__name__)
myglobaldict = {'somedata':''}
class RedisLiveData:
def __init__(self, channel_name):
self.channel_name = channel_name
self.redis_conn = redis.Redis(host='localhost', port=6379, db=0)
pubsub = self.redis_conn.pubsub()
gevent.spawn(self.sub, pubsub)
def sub(self,pubsub):
pubsub.subscribe(self.channel_name)
for message in pubsub.listen():
gevent.spawn(process_rcvd_mesg, message['data'])
def process_rcvd_mesg(mesg):
print "Received new message %s " % mesg
myglobaldict['somedata'] = mesg
g = RedisLiveData("test_channel")
@app.route('/latestmessage')
def latestmessage():
return Response(myglobaldict,mimetype="application/json")
if __name__ == '__main__':
app.run()
JavaScript側では、単純な $.ajax get を使用してメッセージを表示しています。http://localhost:5000/latestmessage
しかし、redis の更新後もクライアントには古いメッセージが表示されます。