Skip to main content

Setup webhooks using existing DRF Serializers

Project description

Django Rest Framework - Webhooks

Configurable webhooks for DRF Serializers

Goals:

  • Use existing DRF Serializers from REST API to serialize data in webhooks
    • Consistent data formatting
    • Reusable OpenAPI schemas
  • Configurable webhooks that simply work (by way of django signals magic) without the developer having to keep track of where to trigger them
    • Still allow for "manual" triggering of webhooks
      • This is useful because signals aren't always triggered
      • For example: QuerySet.update does not trigger signals
  • Disable webhooks using context managers
    • This can be useful when syncing large chunks of data
    • or with a duplex sync (when two systems sync with each other) to avoid endless loops
  • Webhook Signal Session
    • A context manager gathers all models signals and at the end of the session only triggers the resulting webhooks
      • If a model instance is both created and deleted within the session, then no webhook is sent for that model instance
      • If a model instance is created and then also updated within the session, then a created event is sent with the data from the last updated signal. Only one webhook even is sent
      • If a models instance is updated multiple times within the session, then only one webhook event is sent
    • Middleware wraps each request in Webhook Signal Session context
      • NOTE: The developer will have to call the context manager in code that runs outside of requests (for example in celery tasks) manually
  • Automatically determine which nested models need to be monitored for changes

Examples:

from django.db import models
from drf_webhooks import ModelSerializerWebhook, register_webhook
from rest_framework import serializers


class MyModel(models.Model):
    name = models.CharField(max_lenght=100)


class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ['id', 'name']


# Automatic:
register_webhook(MyModel)()

# ---- OR ----
# If you need more configuration:
@register_webhook(MyModel)
class MyModelWebhook(ModelSerializerWebhook):
    base_name = 'core.my_model'

Documentation:

Quckstart:

Install drf-webhooks

poetry add drf-webhooks
# ... or ...
pip install drf-webhooks

Update settings.py:

INSTALLED_APPS = [
    # ...
    'drf_webhooks',
]

MIDDLEWARE = [
    # ...
    'drf_webhooks.middleware.WebhooksMiddleware',
]

# This is required if you don't want your database to fill up with logs:
CELERY_BEAT_SCHEDULE = {
    'clean-webhook-log': {
        'task': 'drf_webhooks.tasks.auto_clean_log',
        'schedule': 60,
        'options': {'expires': 10},
    },
}

Create a new django app

Recommended app name: webhooks

# ----------------------------------------------------------------------
#  apps.py
# ----------------------------------------------------------------------
from django.apps import AppConfig


class WebhooksAppConfig(AppConfig):
    name = "<your module name>"
    label = "webhooks"


# ----------------------------------------------------------------------
#  models.py
# ----------------------------------------------------------------------
from django.contrib.auth import get_user_model
from django.db import models
from django.utils.translation import gettext_lazy as _

from drf_webhooks.models import AbstractWebhook, AbstractWebhookLogEntry


class Webhook(AbstractWebhook):
    # This can also be a group or an organization that the user belongs to:
    owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

    def __str__(self):
        return 'id=%s, events=%s, owner=%s' % (
            str(self.id),
            ', '.join(self.events),
            str(self.owner),
        )


class WebhookLogEntry(AbstractWebhookLogEntry):
    # This can also be a group or an organization that the user belongs to:
    owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

drf_webhooks-0.2.0.tar.gz (15.6 kB view details)

Uploaded Source

Built Distribution

drf_webhooks-0.2.0-py3-none-any.whl (19.3 kB view details)

Uploaded Python 3

File details

Details for the file drf_webhooks-0.2.0.tar.gz.

File metadata

  • Download URL: drf_webhooks-0.2.0.tar.gz
  • Upload date:
  • Size: 15.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.2 CPython/3.10.2 Darwin/21.4.0

File hashes

Hashes for drf_webhooks-0.2.0.tar.gz
Algorithm Hash digest
SHA256 182ed328bb318c5aee947c63874a094229c62f1324a3f2061751f6c792e80635
MD5 342cc1a05221cb1e6dabe616c3ea7463
BLAKE2b-256 43bb34eedab40dad3e40c9c57d95f78f69b8308dfb129928e35abaa0a72394dc

See more details on using hashes here.

File details

Details for the file drf_webhooks-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: drf_webhooks-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 19.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.2 CPython/3.10.2 Darwin/21.4.0

File hashes

Hashes for drf_webhooks-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 969e82cbf4299a562cea57bbe32a5e08dee9ccc514f0f9e2bab9a1dc15debc58
MD5 390616d7f08d063669d152159855e7a5
BLAKE2b-256 6529418beacb90df30b243fb509c8e8f6cbb430f5979b8059fefe44731975abc

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page