用于访问 Asterisk REST 接口的异步库
项目描述
https://github.com/asterisk/ari-py的异步克隆
使用 swagger-py 的异步版本
关于
这个包包含 Asterisk REST 接口的 Python 客户端库。它建立在 Swagger.py库之上,在 Swagger.py 生成的 API 之上提供了改进的、特定于 Asterisk 的 API
用法
使用setup.py脚本从源代码安装。
$ sudo ./setup.py install
API
可以通过aioari.connect方法简单地创建异步 ARI 客户端。这将基于从 Asterisk 下载的 Swagger API 创建一个客户端。
API 被建模为存储库模式,正如您在领域驱动设计中发现的那样。每个 Swagger 资源(又名 API 声明)都映射到一个 Repository 对象,该对象作为客户端(client.channels、client.bridges)上的字段提供。
来自 Asterisk 的响应被映射到第一类对象,类似于存储库模式中的域对象。这些都在对 RESTful API 调用的响应以及通过 WebSocket 接收的事件的字段中提供。
进行 REST 调用
每个存储库对象都提供调用相关 Swagger 资源(bridges.list()、 channels.get())的非实例特定操作的方法。还提供了特定于实例的方法,这些方法需要传递身份参数(channels.get(channelId=id))。
域对象( some_channel.hangup() )上还提供了实例特定的方法。
注册事件回调
Asterisk 可以通过 WebSocket 发送异步消息来指示应用程序感兴趣的事件。
Client对象有一个on_event方法,可用于从 Asterisk 订阅特定事件。
第一类对象还具有“on_event”方法,可以订阅与该对象相关的 Stasis 事件。
对象生命周期
存储库对象在拥有它们的客户端的整个生命周期内都存在。
域对象是短暂的,与 Asterisk 中底层对象的生命周期无关。实际上,这意味着如果您 多次调用channels.get('1234') ,您可能每次都返回一个不同的对象。
您可以保留域对象的实例,但您应该认为它是陈旧的。对象中包含的数据可能已过时,但对象上的方法仍应正常运行。
如果您在 Asterisk 中不再存在的陈旧域对象上调用方法,您将收到 HTTPError 异常(404 Not Found)。
注意事项
Repository 和 Domain 对象公开的动态方法实际上是远程过程调用。当前的实现是同步的,这意味着如果响应缓慢(网络缓慢、丢包、系统负载等)发生任何事情,那么整个应用程序都可能受到影响。
例子
import asyncio
import aioari
client = await aioari.connect('http://localhost:8088/', 'hey', 'peekaboo')
def on_dtmf(channel, event):
digit = event['digit']
if digit == '#':
channel.play(media='sound:goodbye')
channel.continueInDialplan()
elif digit == '*':
channel.play(media='sound:asterisk-friend')
else:
channel.play(media='sound:digits/%s' % digit)
def on_start(channel, event):
channel.on_event('ChannelDtmfReceived', on_dtmf)
channel.answer()
channel.play(media='sound:hello-world')
client.on_channel_event('StasisStart', on_start)
loop = asyncio.get_event_loop()
loop.run_until_complete(client.run(apps="hello"))
发展
该代码是使用Sphinx记录的,它允许IntelliJ IDEA 更好地推断自动完成的类型。
为了保持隔离,我还建议安装(和使用) virtualenv。
$ sudo pip install virtualenv $ mkdir -p ~/virtualenv $ virtualenv ~/virtualenv/ari $ . ~/virtualenv/ari/bin/activate
Setuptools用于构建。Nose用于单元测试,安装了覆盖率插件来生成代码覆盖率报告。通过--with-coverage生成代码覆盖率报告。报告的 HTML 版本放在 cover/index.html中。
$ ./setup.py develop # prep for development (install deps, launchers, etc.) $ ./setup.py nosetests # run unit tests $ ./setup.py bdist_egg # build distributable
去做
创建可用于 Twisted、Tornado 等的异步绑定。
添加对 Python 3 的支持
执照
版权所有 (c) 2013-2014, Digium, Inc. 版权所有 (c) 2016, Denis Fokin。版权所有 (c) 2018,Matthias Urlichs。
aioari 使用BSD 3-Clause License 获得许可。