【发布时间】:2014-01-31 01:29:00
【问题描述】:
我偶然发现了这篇文章: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 cmets。我想通知 userX userY 对他/她的帖子发表了评论。
我以前是靠pyAPNS通知用户的;一个使用 Twisted 向 APNS 发送通知的 python 包装器,但如果 userX 为我的应用程序关闭推送通知,那么 userX 将无法接收应用程序内通知。所以我运气不好。
我只关心应用内通知。我仍然希望 userX 在他使用应用程序时接收实时更新。
当用户发出 POST 请求时,Django 可以将消息发布到 Redis 上的通道。 Node.js 将订阅该频道,socket.io 会将其发送给该特定用户。
这是我的 views.py 的精简版本,其中创建了评论对象。我将 id 发送给发表评论的用户、帖子的 id 以及发表博客帖子的用户的 id。用户将使用 json 向此 url 发出 post 请求: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 数据发送到一个特定的客户端吗?我知道这是一个巨大的post ,但我急需帮助。如果我有什么不清楚的地方,请告诉我,以便我编辑问题。谢谢!
【问题讨论】:
-
这篇文章中的
node.js实现比您在此处显示的要多得多。其余的对你不起作用怎么办? -
你被Node.js锁定了吗?我已经实现了与 python + celery + websockets 类似的东西。
-
你想坚持使用套接字和 node.js 吗?或者您更愿意接受
redis(pub/sub) + gunicorn + SSE (Server Sent Events)? -
@AamirAdnan SSE with Redis pub sub 是另一种解决方案。但问题是,我知道具体发送给哪个客户吗?只有特定的客户才能收到与他们相关的通知。有点像你的 Instagram 活动提要。每次有人点赞或点赞您的照片时,您都会在浏览器或移动设备中收到通知。
-
每个用户都有自己订阅的频道。当用户 A 对用户 B 活动执行操作时,您将在用户 B 频道上发送通知。识别渠道有什么困难?
标签: python ios django json node.js