我看到了这篇文章: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数据发送到一个特定的客户端吗?我知道这是一个庞大的帖子,但是我需要绝望的帮助.如果我不清楚某些事情,请告诉我,以便我可以编辑这个问题.谢谢!