我的网站有一个 Python/Flask 后端和一个 Angular 前端。在后端,有一个进程偶尔会检查 SQS 是否有消息,我希望它向客户端推送通知,然后客户端可以更新 Angular 控制器。我现有技术的最佳方法是什么?
2 回答
为了能够推送到客户端,您必须以某种方式实现 Web 套接字支持。如果你想把它保存在 python/flask 中,这里有关于如何用 gevent 做到这一点的教程:
http://www.socketubs.org/2012/10/28/Websocket_with_flask_and_gevent.html
在那篇文章中,Geoffrey 还提到了一个用于 python/gevent 的 SocketIO 兼容库,它可能允许您利用 SocketIO 客户端 JS 库,称为“gevent-socketio”。
这可能会减少你在跨浏览器兼容性方面要做的工作,因为 SocketIO 已经做了很多。
这是一个关于如何在 AngularJS 中使用 SocketIO 的非常好的教程,这样当事件从 SocketIO 进来时,您可以通知 AngularJS 模型:
http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/
如果您不想托管 Web 套接字后端,则可以使用 PubNub 或 Pusher 之类的托管服务,然后将它们作为服务集成到 AngularJS 中。您可以通过您的 Python 应用程序与这些服务进行通信(当 SQS 通知发生时),它们会为您通知所有连接的客户端。
我知道这有点晚了,但我已经完成了您所要求的几乎所有事情(尽管没有 Angular)。
我最终有一个单独的进程运行一个名为Autobahn的 websocket 服务器,它监听一个 redis pub/sub 套接字,代码在 github 上
这允许您从几乎任何可以访问 redis 的东西向您的客户发送推送通知。
因此,当我想向所有连接的客户端发布消息时,我只需像这样使用 redis:
r = redis.Redis()
r.publish('broadcasts', "SOME MESSAGE")
到目前为止,这工作得相当好。我目前不能做的是向特定客户端发送推送通知。但是,如果您有身份验证系统或其他东西来识别特定用户,您可以将其绑定到打开的 websockets,然后能够直接向特定客户端发送消息:-)
您当然可以使用任何 websocket 服务器或客户端(如 socket.io 或 sock.js),但这对我来说非常有用 :-)