我偶然发现了这篇文章: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数据发送到一个特定的客户端吗?我知道这是一个庞大的帖子,但我需要绝望的帮助。如果我不清楚什么,请让我知道,这样我就可以编辑问题了。谢谢!
发布于 2014-01-24 19:49:52
我绝对不会在这方面使用node.js。您可以在Python中很好地处理websockets,使用Celery或gevent或其他任何东西。
只需创建一个注册到Redis并侦听新消息的线程。
当用户连接时,将套接字放入按用户名索引的弱值散列中;当他们的消息到达时,在该散列中查找目标用户名并将其发送出去。弱值,因为当用户断开连接时,它会自动清除。很简单,真的。
我还会使用websocket而不是HTTP-PUT向服务器发送新消息。
发布于 2014-01-17 06:06:11
发布于 2014-01-22 07:30:58
听起来你应该使用像RabbitMQ http://www.rabbitmq.com/devtools.html这样的东西,还有一个node.js实现等等。
看看吧,它应该会让你振作起来:)
https://stackoverflow.com/questions/21072026
复制相似问题