【问题标题】:using redis in python flask to live send messages在 python 烧瓶中使用 redis 实时发送消息
【发布时间】:2013-04-03 03:03:39
【问题描述】:

下面是一个向浏览器发送消息的简单应用。如果有来自 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 更新之后也有旧消息。

【问题讨论】:

    标签: python redis flask gevent


    【解决方案1】:

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

    如果你想保留 GET 方法,那么你可以通过设置参数 cache 让 jquery 使请求不能被浏览器缓存

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

    【讨论】:

    • 谢谢。我会试一试
    【解决方案2】:

    应该是缓存问题。

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

    【讨论】:

    • 如果是缓存问题,您还可以在 Flask 配置中将 SEND_FILE_MAX_AGE_DEFAULT 设置为 1(或任何足够低的值)。
    • jquery 通过缓存参数内置了 :)
    • 谢谢大家。我在 uwsgi 和 nginx 后面运行它,缓存似乎正在发挥作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2014-07-23
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多