Django的Webhooks **实验性**
项目描述
- 版本:
- 0.1.0
简介
我们希望我们创建的网站能够与其他网站进行通讯。为了实现这一点,我们为客户提供了一个可以连接的URL。这对大多数请求来说都很好,但让我们看看RSS。
RSS将您的文章发布给其他人订阅。每次您有新的文章要发布时,您都会将其添加到可在类似URL下获取的RSS文档中
http://example.com/articles.rss
客户端会连接到这个URL,例如,每20分钟检查一次是否有新内容。如果有新内容,它必须重新下载整个内容,即使它已经有一些之前的内容。我们称这种方法为拉取。
这就是webhooks(或HTTP回调)发挥作用的地方,而不是为客户提供可以连接的URL,当有更新时,客户端会提供一个您要连接的URL。
通过推送而不是拉取更新,您和您的客户端都可以节省带宽,有时甚至可以大量节省。
您可以在Web Hooks Blog上了解更多关于webhooks的信息。Jeff Lindsay的这些幻灯片是此主题的良好介绍:使用Web Hooks。
注意 该软件目前处于规划阶段,将会发生重大变化。您可以关注这里发生的事情,并欢迎帮助实现它,但您可能不应该在它达到alpha版本之前使用它。
示例
使用模型和信号创建事件
在这个示例中,我们将创建一个ModelHook。
ModelHook是一个钩子,它接收一个Django模型和信号。所以每当这个信号被触发时,钩子也会被触发。
您可以通过provides_args属性指定您想要传递给监听器的模型字段。
首先,让我们创建一个简单的模型,存储人员的姓名、地址和一个我们不想传递给监听器的秘密字段。
>>> from django.db import models >>> from django.utils.translation import ugettext_lazy as _>>> class Person(models.Model): ... name = models.CharField(_(u"name"), blank=False, max_length=200) ... address = models.CharField(_(u"address"), max_length=200) ... secret = models.CharField(_(u"secret"), max_length=200)
现在转到钩子本身。我们子类化ModelHook类并在全局webhook注册表中注册它。目前我们将async设置为False,这意味着任务不会被发送到celeryd,而是本地执行。在生产环境中,您肯定希望分发是异步的。
>>> from durian.event import ModelHook >>> from durian.registry import hooks >>> from django.db.models import signals>>> class PersonHook(ModelHook): ... name = "person" ... model = Person ... signal = signals.post_save ... provides_args = ["name", "address"] ... async = False >>> hooks.register(PersonHook)
现在我们可以创建一些监听器。它们可以手动创建或通过使用Web界面创建。监听器必须有一个URL,这是信号发送到的目标回调,您可以选择过滤事件,以便只获取您关心的事件。
>>> # send event when person with name Joe is changed/added. >>> PersonHook().listener( ... url="http://where.joe/is/listening").match( ... name="Joe").save()>>> # send event whenever a person with a name that starts with the >>> # letter "J" is changed/added: >>> from durian.match import Startswith >>> PersonHook().listener( ... url="http://where.joe/is/listening").match( ... name=Startswith("J").save()>>> # send event when any Person is changed/added. >>> PersonHook().listener(url="http://where.joe/is/listening").save()
过滤器可以使用特殊的匹配类,就像上面的Startswith一样。有关这些类的列表,请参阅匹配类。
在这张屏幕截图中,您可以看到选择人员事件的视图
然后为该事件创建一个监听器
创建自定义钩子
有时您可能希望为除了模型之外的其他内容创建钩子。如果已经有了要绑定到的Django信号,那么有SignalHook。否则,您可以通过创建自定义的Hook来发送自己的信号。
钩子的唯一必需属性是名称,这样它就可以在钩子注册表中唯一标识。
定义钩子的有两种方式,要么通过实例化Hook类,要么通过子类化。您可以注册钩子实例或钩子类,只要名称不同即可。
>>> from durian.registry import hooks>>> # Defining a hook by instantiating a hook class: >>> myhook = Hook(name="myhook") >>> hooks.register(myhook)>>> # Defining a hook by subclassing a hook class: >>> class MyHook(Hook): ... name = "myhook" >>> hooks.register(MyHook)
这还支持provides_args属性,它可以自动生成事件过滤器表单。
有关Hook的完整参数和属性列表,请参阅API参考。
通过使用send方法触发钩子非常简单
>>> class MyHook(Hook): ... name = "myhook" ... provides_args = ["name", "address"] ... async = False >>> hooks.register(MyHook) >>> MyHook().send(sender=None, ... name="George Constanza", address="New York City")
监听URL视图
>>> from django.http import HttpResponse >>> from anyjson import deserialize>>> def listens(request): ... payload = deserialize(request.raw_post_data) ... print(payload["name"]) ... return HttpResponse("thanks!")
匹配类
- Any()
匹配任何东西。即使字段根本没有发送。
- Is(pattern)
严格相等。值必须完全匹配。
- Startswith(pattern)
如果字符串以给定的模式开头,则匹配。
- Endswith(pattern)
如果字符串以给定的模式结尾,则匹配。
- Contains(pattern)
如果字符串包含给定的模式,则匹配。
- Like(regex)
通过正则表达式匹配。
安装
您可以通过Python包索引(PyPI)或从源代码安装durian。
要使用pip安装,
$ pip install durian
要使用easy_install安装,
$ easy_install durian
如果您已下载源tarball,可以通过以下步骤安装它,
$ python setup.py build # python setup.py install # as root
示例
许可证
BSD许可协议
联系方式
Ask Solem <askh@opera.com>
项目详情
durian-0.1.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8d663ba763a6421077c2bef4196966aeee08efaacba5b320238ab44bb9a300cc |
|
MD5 | 32ac3b5d8f3135ad25b660b7421bdea9 |
|
BLAKE2b-256 | fb46158e90ff0e9e0efad0315a50a2161ee8811fce0a49c7972fc1f71fc2738a |