Django 创建侦听redis pubsub发布消息的web url

Django 创建侦听redis pubsub发布消息的web url,django,nginx,real-time,redis,publish-subscribe,Django,Nginx,Real Time,Redis,Publish Subscribe,编辑 好的,我有一个从javascript到django视图的长轮询。视图如下所示。它会丢失我在通道中从redis客户端发布的一些消息。另外,我不应该为每个请求都连接到redis,也许redis变量可以保存在会话中? 如果有人能指出我需要做哪些改变才能使这个视图在长时间轮询中工作,那就太棒了!谢谢大家! def listen (request): if request.session: logger.info( 'request session:

编辑 好的,我有一个从javascript到django视图的长轮询。视图如下所示。它会丢失我在通道中从redis客户端发布的一些消息。另外,我不应该为每个请求都连接到redis,也许redis变量可以保存在会话中? 如果有人能指出我需要做哪些改变才能使这个视图在长时间轮询中工作,那就太棒了!谢谢大家!

    def listen (request):
        if request.session:
            logger.info( 'request session: %s' %(request.session))
        channel = request.GET.get('channel', None)
        if channel:
            logger.info('not in cache - first time - constructing redis object')
            r = redis.Redis(host='localhost', port=6379, db=0)
            p = r.pubsub()
            logger.info('subscribing to channel: %s' %(channel))
            p.psubscribe(channel)
            logger.info('subscribed to channel: %s' %(channel))
            message =  p.listen().next()
            logger.info('got msg %s' %(message))

            return HttpResponse(json.dumps(message));

        return HttpResponse('')
--原始问题-- 我试图使用django、python创建一个聊天应用程序,并试图避免轮询机制。我一直在努力解决这个问题,所以任何指点都将非常感激

由于大多数浏览器不支持web套接字,我认为长轮询是正确的选择。现在,我正在寻找一种比常规轮询更具扩展性且易于与python django堆栈集成的东西。一旦我完成了这个开发,我计划评估其他python框架tornado twister、gevent等

我做了一些研究,喜欢redis pubsub机制。聊天信息将发布到两个用户都已订阅的频道。以下是我的问题:

据我所知,apache无法很好地扩展,因为长轮询很快就会遇到进程/线程限制。因此,我决定切换到nginx。这个理由正确吗?nginx中是否有我担心的问题?我特别担心的是,最新版本不支持http 1.1进行代理传递,正如在

如何在浏览器端创建邮件订阅的客户端部分?在我看来,它将是一个javascript代码长期轮询的url。因此,在javascript级别,客户机将轮询在服务器端以非阻塞方式被阻塞的url。在这种情况下,当出现一条新的聊天信息时,服务器返回结果。Javascript做它需要做的事情,然后再次轮询相同的url。这种想法正确吗?当javascript循环暂停时,在两个间隔之间会发生什么?我们是否会从服务器端释放任何消息

本质上,我想创建以下内容:

在redis中,我将消息发布到一个通道,foo也可以使用redis cli—稍后很容易将其合并到python/django中

我希望相同的消息出现在两个使用相同js代码进行轮询的浏览器窗口中。假设浏览器代码知道用于测试的通道名称

我发布的第二条消息再次出现在两个浏览器窗口中

我不熟悉实时应用程序,所以对于任何可能没有意义的问题,我深表歉意


谢谢大家!

好吧,只需部分回答您的问题,并提及众多选项中的一个:与异步工作者类一起使用是一种解决长轮询/非阻塞请求的解决方案,非常容易设置

塔克斯!我曾简要地读过关于古尼康的书。我又在读了一遍。当您编写上述消息订阅请求http端的部分时,django代码是什么样子的?它如何影响其他已经编写的django代码?
    def listen (request):
        if request.session:
            logger.info( 'request session: %s' %(request.session))
        channel = request.GET.get('channel', None)
        if channel:
            logger.info('not in cache - first time - constructing redis object')
            r = redis.Redis(host='localhost', port=6379, db=0)
            p = r.pubsub()
            logger.info('subscribing to channel: %s' %(channel))
            p.psubscribe(channel)
            logger.info('subscribed to channel: %s' %(channel))
            message =  p.listen().next()
            logger.info('got msg %s' %(message))

            return HttpResponse(json.dumps(message));

        return HttpResponse('')