烧瓶的WAMP RPC和酒吧/酒吧

Flask-WAM的Python项目详细描述


TravisPython27Python34Python35Python36

烧瓶水

带有WAMP消息的烧瓶应用程序。

有关wamp是什么的背景,请参见here

请记住,web应用程序消息传递协议不仅仅是针对web的。所以,如果你想让你的flask应用成为一个更大架构中的wamp组件…那你可以!flask wamp提供两个选项:

  1. 烧瓶应用程序之间的rrpc或pubsub消息传递,支持后端的微服务体系结构
  2. 浏览器和Flask应用程序之间的RRPC或PubSub消息传递,支持前端用户的异步、并发调用和实时更新

对于这两种情况,您都需要一个wamp路由器/代理对等机,为此,我建议您使用Crossbar.io

用例

  • 浏览器(我建议wampy.js)和flask应用程序之间的实时更新
  • LI>升级现有烧瓶微服务的力量

为什么不仅仅是websockets?

websockets当然是一个用于实时客户机-服务器通信的良好实现。为此,您需要一些flask中间件,例如Flask-SocketIO,或flask-sockets。有了wamp,你就没有了。

然后你可能会努力在你的组件之间找到一个成熟的RPC,即使你这样做了,每个组件都需要知道另一个组件的存在,并将主机、端口和路径重新绑定到它上面。

使用wamp,前端和后端之间的技术以及后端组件之间的相互通信也保持一致。

您将面临的唯一真正的障碍是使用合理的配置启动和运行crossbar.io,但这方面有很大的支持,docs,演示和早期开发的基本用例很简单。这个路由器/代理对等机是选择wamp的一个重要原因,因为它具有复杂的消息传递模式和高级功能,如authn/z和元事件。对于客户同行来说,wampy.js和flask wamp使这一点非常直接。

另一个你可能想在你的flask消息中考虑flask wamp的原因是在hood下它使用wampy,wampy可以配置为使用eventletGevent,所以如果你的架构已经绑定到其中一个,flask wamp可以使用你选择的异步网络解决方案。

一般来说,wamp有一些您可以直接使用的特性,比如负载平衡和各种身份验证模式。

工作原理

这是一个标准的烧瓶扩展。

在hood下,您有一个wampy客户机实例,该实例具有到crossbar的wamp websocket连接。因此,对于你的flask应用程序的每个实例,你也有一个wampy实例。您必须将flask应用程序包装在flask wamp应用程序中,以实现此目的,并提供路由器主机和领域名称。这应该来自flask配置对象-请参见test_flask_wamp.py以获取示例。

然后,就像使用nameko-wamp一样,您可以声明一个flask端点/视图来完成wamp被调用方或订阅者角色。这并不能阻止您将http请求路由到这些视图-讨价还价!

完成此操作后,任何其他wamp调用者或发布者组件都可以通过wamp协议与之通信,无论这是另一个flask应用程序还是浏览器,并假设它们都连接到同一个领域。声明使用decorators完成。这些“观点”然后在装饰下做什么完全取决于你。

要让flask对等方完成调用者或发布者角色,您需要该wampy实例及其提供的api的句柄。同样,就像nameko-wamp,我们使用依赖注入,这样所有视图都可以通过g对象访问wampy。例如,

fromflaskimportgdefmy_view_function():wampy=g.wampywampy.rpc.some_remote_procedure(*args,**kwargs)wampy.publish(topic="some topic",message="this is fun!")# maybe do other stuff and return something

每一个视图都可以访问wampy,不管它是不是一个装饰视图。wampy已经连接到crossbar,所以not需要像wampy文档建议的那样将它用作上下文管理器。有关wampy的api的更多信息,请参见ReadTheDocs

运行测试

测试运行器使用wampy提供的crossbar测试夹具。

$ pip install --editable .[dev]
$ py.test ./test -v

或者,更简单地说

$ make tests

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java OpenShift的齿轮特性   java如何在Liferay站点的每个页面上放置公司地址和电话?   java确定整数数组中是否存在一个子集,在两个条件下求和到给定的目标值   序列化为什么java中的serialVersionUID必须是静态的、最终的、长类型的?   java响应返回null   java注入接口实现Quarkus   java我不明白为什么第二次排序的运行时间比第一次慢?   (Java)显示图像的最佳方式?   java Android应用程序因添加布局而崩溃   java如何在运行时获取泛型变量的类   java Selenium web驱动程序:无效的选择器:*:WebKitFullScreenSentor   Spring中的java注入值始终为空   Eclipse中带有TestNG插件的@BeforeSuite和@AfterSuite的java问题   使用trycatch块、filewriter和printwriter在java中创建自定义类   如何在Java 安卓上绘制相交的两条线