首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django:使用Redis PubSub,Node.js & Socket.io的JSON通知

Django:使用Redis PubSub,Node.js & Socket.io的JSON通知
EN

Stack Overflow用户
提问于 2014-01-12 14:43:12
回答 4查看 7.7K关注 0票数 19

我偶然发现了这篇文章:http://maxburstein.com/blog/realtime-django-using-nodejs-and-socketio/

这让我在某种程度上走上了正确的方向。

我目前有一个iOS前端和一个Django后端。我使用Gunicorn向前端应用程序提供数据。我的iOS应用程序和我的后台之间的通信是基于REST的。我只是来回发送JSON。我不提供任何网页。只是JSON响应。

我已经实现了一个简单的帖子和评论模型:

代码语言:javascript
复制
class Post(models.Model):
         user = models.ForeignKey(User)
         blog = models.CharField(max_length=5000)

class Comment(models.Model):
         comment = models.CharField(max_length=140)
         user = models.ForeignKey(User)
         post_id = models.ForeignKey(Post)
         created_at = models.DateTimeField(auto_now_add=True)

用户可以发布博客帖子,其他用户也可以发表评论。因此,如果userX有一篇博客文章和userY对它的评论。我想通知userX,userY在他/她的帖子上发表了评论。

我过去常常依赖pyAPNS来通知用户;这是一个使用Twisted向APNS发送通知的python包装器,但是如果userX关闭了我的应用的推送通知,那么userX将无法接收应用内通知。所以我没那么走运。

我只关心应用内通知。我仍然希望userX在应用程序中时能够接收实时更新。

当用户发出POST请求时,Django可以将消息发布到Redis上的频道。Node.js将订阅该频道,并由socket.io将其发送给该特定用户。

下面是我的views.py的精简版本,其中创建了comment对象。我发送发表评论的用户的id、帖子的id和发表博客帖子的用户的id。用户将使用json:http://example.com:8000/upload-comment/向此url发出post请求

代码语言:javascript
复制
def UploadComment(request):
         data  = json.loads(request.body)
         redis_server = redis.Redis(host='12.345.678.9', port=6379, db=0, password='mypassword')
         newComment = Comment()
         newComment.comment = data['comment']
         newComment.user_id = data['user_id']
         newComment.post_id = data['post_id']
         newComment.save() 
         PostOwner = data['post_owner_id'] #id of the blog post owner
         # Need to send a notification to PostOwner
         response_data = []
         response_data.append(
                 {'send_notifcation_to': PostOwner
                  'action': 'comment'
                  'comment_by': newComment.user.username)}
         redis_server.publish("notifications", json.dumps(response_data))
         return HttpResponse('Request Successful')

Node.js实现(根据Max Burstein上面的文章)

代码语言:javascript
复制
var http = require('http');
var server = http.createServer().listen(4000);
var io = require('socket.io').listen(server);

这就是我所得到的:(我知道这很可悲,但我还有很多问题要问。如何让node.js订阅我从Django发布到的远程Redis服务器?有多少个客户端可以连接到此套接字?有限制吗?是否为每个客户端创建了套接字?还是每个客户端都在同一个套接字上监听?我可以通过此套接字将json数据发送到一个特定的客户端吗?我知道这是一个庞大的帖子,但我需要绝望的帮助。如果我不清楚什么,请让我知道,这样我就可以编辑问题了。谢谢!

EN

回答 4

Stack Overflow用户

发布于 2014-01-24 19:49:52

我绝对不会在这方面使用node.js。您可以在Python中很好地处理websockets,使用Celery或gevent或其他任何东西。

只需创建一个注册到Redis并侦听新消息的线程。

当用户连接时,将套接字放入按用户名索引的弱值散列中;当他们的消息到达时,在该散列中查找目标用户名并将其发送出去。弱值,因为当用户断开连接时,它会自动清除。很简单,真的。

我还会使用websocket而不是HTTP-PUT向服务器发送新消息。

票数 3
EN

Stack Overflow用户

发布于 2014-01-17 06:06:11

Stack Overflow用户

发布于 2014-01-22 07:30:58

听起来你应该使用像RabbitMQ http://www.rabbitmq.com/devtools.html这样的东西,还有一个node.js实现等等。

看看吧,它应该会让你振作起来:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21072026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档