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://localhost:5000/latestmessage?t=timestamp您可以为从 ajax 发送的请求添加时间戳或随机数。

于 2013-04-12T03:49:26.403 回答
1

我建议您使用 POST 而不是 GET 作为 http 方法,您可以消除缓存问题和浏览器(如 chrome)的一些烦人行为,其中第一个请求之后的请求将等待第一个完成后再发送到网络服务器。

如果要保留 GET 方法,则可以要求 jquery 使用设置参数缓存使浏览器无法缓存请求

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