Skip to main content
Join the official 2019 Python Developers SurveyStart the survey!

Django websub subscriber

Project description

Build Status codecov Support Python versions 3.6 and 3.7 pypi-version

Django websub subscriber.

Installation

pip install websubsub

Add websubsub.apps.WebsubsubConfig to the list of INSTALLED_APPS in your settings.py:

INSTALLED_APPS = [
    ...,
    'websubsub.apps.WebsubsubConfig'
]

Set the SITE_URL setting in your settings.py to the full url of your project site, e.g. https://example.com. It will be used to build full callback urls.

Set DUMBLOCK_REDIS_URL settings in your settings.py. Redis locks are used to ensure subscription/unsubscription tasks are consistent with hub and local database.

SITE_URL = 'http://example.com'
DUMBLOCK_REDIS_URL= 'redis://redishost:6379'

Add websubsub.tasks.refresh_subscriptions and websubsub.tasks.retry_failed to celerybeat schedule. If you define it in settings.py:

CELERY_BEAT_SCHEDULE = {
    'websub_refresh': {
        'task': 'websubsub.tasks.refresh_subscriptions',
        'schedule': 3600  # Hourly
    },
    'websub_retry': {
        'task': 'websubsub.tasks.retry_failed',
        'schedule': 600  # Every 10 minutes
    },
}

Usage

Create Websub callback

Create celery task handler, usually in tasks.py:

from celery import shared_task

@shared_task
def news_task(data):
    print('got news!')

Callback url should end with uuid. Register url for handler in urls.py:

from websubsub.views import WssView
from .tasks import news_task, reports_task

urlpatterns = [
    path('/websubcallback/news/<uuid:id>', WssView.as_view(news_task), name='webnews')
    path('/websubcallback/reports/<uuid:id>', WssView.as_view(reports_task), name='webreports')
]

Subscribe

You can create subscription on the go, or use static subscriptions.

To create subscription in the code:

from websubsub.models import Subscription
Subscription.create(topic='mytopic', urlname='webnews', hub='http://example.com')

This will create Subscription object in the database and schedule celery task to subscribe with hub.

Static subscriptions

[TODO] Not sure it is the best way to handle static subscriptions.

Static subscriptions can be defined in your settings.py, they are then materialized with management command ./manage.py websubscribe_static.

Add static subscriptions in your settings.py:

WEBSUBS_HUBS = {
    'http://example.com': {
        'subscriptions': [
            # (topic, urlname) pairs
            ('mytopic', 'webnews'),
            ...
        ]
    }
}

Execute ./manage.py websubscribe_static

Unsubscribe

To unsubscribe existing subscription, call Subscription.unsubscribe() method:

from websubsub.models import Subscription
Subscription.objects.get(pk=4).unsubscribe()

Discovery

Not implemented

Settings

SITE_URL - ex.: https://example.com. Required. Will be used to build full callback urls.

DUMBLOCK_REDIS_URL - ex.: redis://redishost:6379. Required. Will be used to lock atomic tasks.

WEBSUBS_DEFAULT_HUB_URL

WEBSUBS_MAX_CONNECT_RETRIES

WEBSUBS_MAX_HUB_ERROR_RETRIES

WEBSUBS_MAX_VERIFY_RETRIES

WEBSUBS_VERIFY_WAIT_TIME - How many seconds should pass before unverified subscription is considered failed. After that time, websubsub.tasks.retry_failed() task will be able to retry subscription process again.

Testing

pip install -r tests/requirements.txt
py.test

Project details


Download files

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

Files for websubsub, version 0.6
Filename, size File type Python version Upload date Hashes
Filename, size websubsub-0.6-py3-none-any.whl (18.7 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size websubsub-0.6.tar.gz (12.7 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page