使用python flask中的redis实时发送消息

2024-10-01 07:48:42 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个简单的应用程序发送mesg到浏览器。如果redis通道有一个新的mesg,它将被发送,或者以非阻塞的方式发送最后知道的值。 但我做错了什么。有人能帮我理解吗

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方面,我只是使用一个简单的$.ajaxget来查看消息。 但是客户端http://localhost:5000/latestmessage即使在redis更新之后也有旧消息。在


Tags: namefromimportselfredisappmessagedef
2条回答

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

如果您想保留GET方法,那么可以通过设置参数cache请求jquery使请求不可缓存

$.ajax(..., {cache:false})

应该是缓存问题。在

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

相关问题 更多 >