Skip to main content

Making Django REST Framework reactive

Project description

This package enables regular Django REST Framework views to become reactive, that is so that client-side applications may get notified of changes to the underlying data as soon as they happen, without the need to poll the API again. While the initial request is done as a regular HTTP request, all the update notifications come through WebSockets.

Install

Prerequisites

The reactive extensions for Django REST Framework currently require the use of django-websocket-redis for push notifications. When Channels get merged into Django mainline, we will probably migrate to using those.

From PyPI

pip install djangorestframework-reactive

From source

pip install https://github.com/genialis/django-rest-framework-reactive/archive/<git-tree-ish>.tar.gz

where <git-tree-ish> can represent any commit SHA, branch name, tag name, etc. in DRF Reactive’s GitHub repository. For example, to install the latest version from the master branch, use:

pip install https://github.com/genialis/django-rest-framework-reactive/archive/master.tar.gz

Configure

There are several things that need to be configured in the Django settings file:

  • rest_framework_reactive needs to be added to INSTALLED_APPS.

  • DEFAULT_PAGINATION_CLASS needs to be set to rest_framework_reactive.pagination.LimitOffsetPagination (optionally, this pagination class can instead be set for all viewsets configured for reactivity).

  • WS4REDIS_SUBSCRIBER needs to be set to rest_framework_reactive.websockets.QueryObserverSubscriber.

  • DJANGO_REST_FRAMEWORK_REACTIVE needs to be configured with hostname and port where the internal RPC will live. It should be set to something like:

    DJANGO_REST_FRAMEWORK_REACTIVE = {
       'host': 'localhost',
       'port': 9432,
    }

    The hostname and port must be such that they are reachable from the Django application server.

Each ViewSet that should support reactivity, must be registered by using:

from rest_framework_reactive.pool import pool
pool.register_viewset(MyViewSet)

The best place to do this is inside models.py or better, inside the ready handler of an AppConfig.

At the moment, you are required to change your project’s manage.py to monkey patch the runobservers command with support for gevent coroutines. Note that regular Django application server still runs as normal, only the observer process runs using coroutines.

The modified manage.py should look as follows:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "genesis.settings.development")

    # This is needed here so the monkey patching is done before Django ORM is loaded. If we
    # do it inside the 'runobservers' management command, it is already too late as a database
    # connection has already been created using thread identifiers, which become invalid
    # after monkey patching.
    if 'runobservers' in sys.argv:
        import gevent.monkey
        import psycogreen.gevent

        # Patch the I/O primitives and psycopg2 database driver to be greenlet-enabled.
        gevent.monkey.patch_all()
        psycogreen.gevent.patch_psycopg()

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

And finally, urls.py need to be updated to include some additional paths:

urlpatterns = [
  # ...
  url(r'^api/queryobserver/', include('rest_framework_reactive.api_urls')),
  # ...
]

Run

In addition to running a Django application server instance, you need to also run a separate observer process. You may start it by running:

python manage.py runobservers

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

djangorestframework-reactive-0.9.0.tar.gz (16.7 kB view details)

Uploaded Source

Built Distribution

djangorestframework_reactive-0.9.0-py2.7.egg (43.9 kB view details)

Uploaded Source

File details

Details for the file djangorestframework-reactive-0.9.0.tar.gz.

File metadata

File hashes

Hashes for djangorestframework-reactive-0.9.0.tar.gz
Algorithm Hash digest
SHA256 78f80c132e52787e8caf4b00118e0692a019272d85aa9d52858f592170de9c49
MD5 a21000a9e902b5565464c7df12c14ad7
BLAKE2b-256 aac1e28a0f65cea8e06977534147fcaad41f0ca7a57462e16d3e199d69a23e3d

See more details on using hashes here.

File details

Details for the file djangorestframework_reactive-0.9.0-py2.7.egg.

File metadata

File hashes

Hashes for djangorestframework_reactive-0.9.0-py2.7.egg
Algorithm Hash digest
SHA256 caee92b53e1de9f742c2fb0d31e0a0923beb81cf83d1c15df1b07a8f885dc466
MD5 9f311334d2504c889c332df18e76d7af
BLAKE2b-256 b7364ace3f27dd1a98ad98072d154eb788a2bfb260767f20001d1b4699e00a63

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