我偶然发现了这篇文章: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的精简版本,其中创建了comment对象。我发送发表评论的用户的id、帖子的id和发表博客帖子的用户的id。用户将使用json:http://example.com:8000/upload-comment/向此url发出post请求
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数据发送到一个特定的客户端吗?我知道这是一个庞大的帖子,但我需要绝望的帮助。如果我不清楚什么,请让我知道,这样我就可以编辑问题了。谢谢!
https://stackoverflow.com/questions/21072026
复制相似问题