4

以下は、ブラウザにメッセージを送信する簡単なアプリです。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 の更新後もクライアントには古いメッセージが表示されます。

4

2 に答える 2

1

HTTP メソッドとして GET の代わりに POST を使用することをお勧めします。これにより、キャッシングの問題と、最初の後の要求が Web サーバーに送信される前に最初の要求が完了するまで待機する、chrome などのブラウザーからの厄介な動作が解消されます。

GET メソッドを保持したい場合は、設定パラメーター cache を使用して、jquery に要求をブラウザーでキャッシュ不可にするように依頼できます。

$.ajax(..., {cache:false})
于 2013-04-16T13:56:36.923 に答える
1

それはキャッシュの問題であるはずです。

http://localhost:5000/latestmessage?t=timestampajax から送信されるリクエストに、タイムスタンプまたは乱数を追加できます。

于 2013-04-12T03:49:26.403 に答える