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

 老陈 发布于 2023-02-04 13:12

我看到了这篇文章:http://maxburstein.com/blog/realtime-django-using-nodejs-and-socketio/

这使我走向了一个正确的方向.

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

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

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的精简版本,其中创建了注释对象.我发送了发表评论的用户,帖子的ID以及发布博客文章的用户的ID.用户将使用json向此网址发布请求:http://example.com:8000 / upload-comment /

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的文章从上面)

var http = require('http');
var server = http.createServer().listen(4000);
var io = require('socket.io').listen(server);

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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有