使用Redis在Python Flask中实现实时消息发送

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 方法来查看消息。 但是即使在 Redis 更新后,客户端 http://localhost:5000/latestmessage 仍然显示旧的消息。
2个回答

1
我建议您使用POST而不是GET作为HTTP方法,这样可以消除缓存问题和某些令人讨厌的浏览器行为,比如Chrome会在第一次请求完成之前等待后续请求发送到Web服务器。
如果您想保留GET方法,那么您可以要求jQuery通过设置参数缓存使请求不可被浏览器缓存。
$.ajax(..., {cache:false})

1

这应该是缓存问题。

您可以在ajax发送的请求http://localhost:5000/latestmessage?t=timestamp中添加时间戳或随机数。


如果这是一个缓存问题,您可以在Flask配置中将SEND_FILE_MAX_AGE_DEFAULT设置为1(或任何足够低的值)。 - mtth
jQuery有内置的缓存参数 :) - Tommaso Barbugli
谢谢大家。我正在uwsgi和nginx后面运行它,但缓存似乎出了问题。 - Linus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接