Skip to main content

Django/PostgreSQL implementation of the Meteor DDP service.

Project description

Django/PostgreSQL implementation of the Meteor DDP service, allowing Meteor to subscribe to changes on Django models.

Requirements

The core concept is that events are dispatched asynchronously to browsers using WebSockets and server-side using a PostgreSQL extension to the SQL syntax called NOTIFY (and its bretheren, LISTEN and UNLISTEN). You must be using PostgreSQL with psycopg2 in your Django project for django-ddp to work. There is no requirement on any asynchronous framework such as Reddis or crossbar.io as they are simply not needed given the asynchronous support provided by PostgreSQL with psycopg2. As an added bonus, events dispatched using NOTIFY in a transaction are only emitted if the transaction is successfully committed.

Scalability

All database queries to support DDP events are done once by the server instance that has made changes via the Django ORM. Django DDP multiplexes messages for active subscriptions, broadcasting an aggregated change message on channels specific to each Django model that has been published.

Peer servers subscribe to aggregate broadcast events only for channels (Django models) that their connected clients subscribe to. The aggregate events received are de-multiplexed and dispatched to individual client connections. No additional database queries are required for de-multiplexing or dispatch by peer servers.

Limitations

The 0.2.x release series only supports DDP via WebSockets. Future development may resolve this by using SockJS, to support browsers that don’t have WebSockets.

Changes must be made via the Django ORM as django-ddp uses Django signals to receive model save/update signals.

Installation

Install the latest release from pypi (recommended):

pip install django-ddp

Clone and use development version direct from GitHub (to test pre-release code):

pip install -e git+https://github.com/commoncode/django-ddp@develop#egg=django-ddp

Example usage

Add ‘dddp’ to your settings.INSTALLED_APPS:

# settings.py
...
INSTALLED_APPS = list(INSTALLED_APPS) + ['dddp']

Add ddp.py to your Django app:

# bookstore/ddp.py

from dddp.api import API, Collection, Publication
from bookstore import models

class Book(Collection):
    model = models.Book


class Author(Collection):
    model = models.Author


class AllBooks(Publication):
    queries = [
        models.Author.objects.all(),
        models.Book.objects.all(),
    ]


class BooksByAuthorEmail(Publication):
    def get_queries(self, author_email):
        return [
            models.Author.objects.filter(
                email=author_email,
            ),
            models.Book.objects.filter(
                author__email=author_email,
            ),
        ]


API.register(
    [Book, Author, AllBooks, BooksByAuthorEmail]
)

Connect your Meteor app to the Django DDP service:

// bookstore.js
if (Meteor.isClient) {
    // Connect to Django DDP service
    Django = DDP.connect('http://'+window.location.hostname+':8000/');
    // Create local collections for Django models received via DDP
    Authors = new Mongo.Collection("bookstore.author", {connection: Django});
    Books = new Mongo.Collection("bookstore.book", {connection: Django});
    // Subscribe to all books by Janet Evanovich
    Django.subscribe('BooksByAuthorEmail', 'janet@evanovich.com');
}

Start the Django DDP service:

DJANGO_SETTINGS_MODULE=myproject.settings dddp

In a separate terminal, start Meteor (from within your meteor app directory):

meteor

Contributors

Tyson Clugg
  • Author, conceptual design.

MEERQAT
  • Project sponsor - many thanks for allowing this to be released under the BSD license!

David Burles
  • Expert guidance on how DDP works in Meteor.

Brenton Cleeland
  • Great conversations around how collections and publications can limit visibility of published documents to specific users.

Muhammed Thanish

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

django-ddp-0.2.5.tar.gz (24.1 kB view hashes)

Uploaded Source

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