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 import action, 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 reduxBridge (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 { reduxBridge } from 'django_redux';

const store = createStore(
  reducer,
);


reduxBridge.connect();
reduxBridge.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 { reduxBridge } from 'django_redux';


export const incrementCounter = createAction(ActionTypes.INCREMENT_COUNTER, (incrementBy) => {
  reduxBridge.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
    • send_action

  • 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.8.tar.gz (9.1 kB view details)

Uploaded Source

Built Distribution

django_redux-0.0.8-py2.py3-none-any.whl (136.6 kB view details)

Uploaded Python 2 Python 3

File details

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

File metadata

File hashes

Hashes for django_redux-0.0.8.tar.gz
Algorithm Hash digest
SHA256 a632e166b6550704151fc40d5a42daf4c000eb39d100d8769565c37b18f1f52e
MD5 de3a0778a3616be0699d33fbb08f7f77
BLAKE2b-256 7a65ac8eda27b16e788fe44e6c878a6571ef80d82f11cba0e69698e3e795c014

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for django_redux-0.0.8-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 ff162a83d3f2e6ae27a35e7f6f2be7481474a0179df57a6e4d5f6739782ffd2c
MD5 9a78294ced7d3376bab72020f7a656bd
BLAKE2b-256 5a89c3c9a14a78e0f2432328439bb12cb64d4006133f288398327229c11987c7

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