我看到了这篇文章:http://maxburstein.com/blog/realtime-django-using-nodejs-and-socketio/
这篇文章让我有了一些方向感。
我目前拥有一个iOS前端和一个Django后端。我使用Gunicorn将数据提供给前端应用程序。我的iOS应用程序与后端之间的通信基于REST。我只是简单地发送JSON数据。我没有提供任何网页,只有JSON响应。
我已经实现了一个简单的Post和Comment模型:
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)
用户可以发布博客文章,其他用户可以对它们进行评论。因此,如果用户X有一篇博客文章,用户Y对其发表评论。我希望通知用户X,用户Y对他/她的文章发表了评论。
我过去依赖 pyAPNS 来通知用户;这是一个使用Twisted向APNS发送通知的Python包装器,但是如果用户X关闭了我的应用程序的推送通知,那么用户X将无法接收到应用内通知。所以我就没办法了。
我只关心应用内通知。我仍然希望用户X在使用应用程序时能够收到实时更新。
当用户进行POST请求时,Django可以将消息发布到Redis上的频道中。Node.js将订阅该频道,socket.io将将其发送给特定的用户。
这是我的views.py的简化版本,其中创建评论对象。我发送制作者ID、帖子ID和博客文章作者ID。用户将使用json将POST请求发送到此URL: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服务器的数据?有多少客户端可以连接到此套接字?是否有限制?每个客户端都创建一个套接字吗?还是每个客户端都在同一个套接字上监听?我能否通过此套接字向一个特定的客户端发送JSON数据?我知道这是一个很大的帖子,但我非常需要帮助。如果我有什么表述不清的地方,请告诉我,这样我就可以编辑问题。谢谢!
node.js
的实现比你在这里展示的要多得多。除此之外,还有什么部分不能正常工作呢? - Aaron Dufourredis(pub/sub) + gunicorn + SSE (Server Sent Events)
? - Aamir Rind