Skip to main content

A re-usable bridge between Django channels and Redux Edit

Project description

A re-usable bridge between Django channels and Redux.

Quickstart

$ pip install django_redux
$ npm install django_redux

Create a file called engine.py for your project:

from django_redux.engine import action
from django_redux.consumers import ReduxConsumer


class MyConsumer(ReduxConsumer):

    def connect(self, message, **kwargs):
        if message.user.is_authenticated():
            self.send({
                'type': 'SET_USER',
                'user': {
                    'username': self.message.user.username,
                }
            })

    # This method will be called when the `INCREMENT_COUNTER` action gets
    # fired from the JS via the WebsocketBridge (see below).
    @action('INCREMENT_COUNTER')
    def incr_counter(self, message):
        self.group_send('broadcast', {'type': 'INCREMENTED_COUNTER', 'incrementBy': message['incrementBy']})

Create a file called routing.py for your project:

from channels.routing import route_class
from .consumers import MyConsumer

channel_routing = [
    route_class(MyConsumer),
]

in your settings:

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'asgi_redis.RedisChannelLayer',
        'CONFIG': {
            'hosts': [('localhost', 6379)],
        },
        'ROUTING': 'myproject.routing.channel_routing',
    },
}

In your js entry point:

import React from 'react';

import { render } from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, } from 'redux';

import reducer from '../reducers';
import Root from '../containers/Root.react';

import { WebsocketBridge } from 'django_redux';

const store = createStore(
  reducer,
);


WebsocketBridge.connect();
WebsocketBridge.listen(store);

render(
  <Provider store={store}>
    <Root />
  </Provider>,
  document.getElementById('root')
);

To send an action from redux:

import { createAction } from 'redux-actions';

import ActionTypes from './constants';
import { WebsocketBridge } from 'django_redux';


export const incrementCounter = createAction(ActionTypes.INCREMENT_COUNTER, (incrementBy) => {
  WebsocketBridge.send({
    type: ActionTypes.INCREMENT_COUNTER,
    incrementBy
  });
});

To send an action from channels:

from django_redux import send_action

send_action('mygroup', {
    'type': 'ACTION_NAME',
    'payload': {'any': 'thing'},
})

TODO:

  • Tests

  • Data binding

  • Docs
    • ReduxConsumer.get_control_channel

    • Multiplexing

Credits

Most of this code is adapted from johnpaulett/channel_chat.

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_redux-0.0.4.tar.gz (6.4 kB view details)

Uploaded Source

Built Distribution

django_redux-0.0.4-py2.py3-none-any.whl (11.4 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django_redux-0.0.4.tar.gz.

File metadata

File hashes

Hashes for django_redux-0.0.4.tar.gz
Algorithm Hash digest
SHA256 d9990d46c6d8f43f566dda30ccd9f2715f64f74edd1d8fe7a5731d2603e1c8db
MD5 90fcb37f0fe66741cd3ff997c6e2df15
BLAKE2b-256 a75088f0c89059b87aaa278d46897a5a9f1bed74dd62dc338858f68956ac1ec7

See more details on using hashes here.

File details

Details for the file django_redux-0.0.4-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_redux-0.0.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 d55d603610e11f53337b057d07f28d5d8ce77966792e2aa5e4382584fa15ad38
MD5 d347db3c16fa2ef3ce22126b9ceb3d71
BLAKE2b-256 426d7c4ee79bc7657d5b199c9236f66d502de75477ae52058ba606ac54647ac8

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