跳转到主要内容

Django的Webhooks **实验性**

项目描述

版本:
0.1.0
http://cloud.github.com/downloads/ask/durian/webhooks-logo.png

简介

我们希望我们创建的网站能够与其他网站进行通讯。为了实现这一点,我们为客户提供了一个可以连接的URL。这对大多数请求来说都很好,但让我们看看RSS。

RSS将您的文章发布给其他人订阅。每次您有新的文章要发布时,您都会将其添加到可在类似URL下获取的RSS文档中

http://example.com/articles.rss

客户端会连接到这个URL,例如,每20分钟检查一次是否有新内容。如果有新内容,它必须重新下载整个内容,即使它已经有一些之前的内容。我们称这种方法为拉取

这就是webhooks(或HTTP回调)发挥作用的地方,而不是为客户提供可以连接的URL,当有更新时,客户端会提供一个您要连接的URL。

通过推送而不是拉取更新,您和您的客户端都可以节省带宽,有时甚至可以大量节省。

http://cloud.github.com/downloads/ask/durian/webhook-callback2.png

您可以在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一样。有关这些类的列表,请参阅匹配类

在这张屏幕截图中,您可以看到选择人员事件的视图

http://cloud.github.com/downloads/ask/durian/durian-shot-select_event.png

然后为该事件创建一个监听器

http://cloud.github.com/downloads/ask/durian/durian-shot-create_listenerv2.png

创建自定义钩子

有时您可能希望为除了模型之外的其他内容创建钩子。如果已经有了要绑定到的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 (141.9 kB 查看哈希值)

上传时间 源代码

支持者