Metadata-Version: 2.1
Name: django-channels-handlers
Version: 0.2.1
Summary: Django Channels, without the Pain 💊
Home-page: https://github.com/joshua-s/django-channels-handlers
Author: Josh Smith
Author-email: josh@joshsmith.codes
License: MIT
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: MIT License
Classifier: Framework :: Django
Classifier: Framework :: Django :: 2.2
Classifier: Framework :: Django :: 3.0
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Intended Audience :: Developers
Requires-Python: >=3.7
Description-Content-Type: text/markdown
Requires-Dist: Django>=2.2
Requires-Dist: channels>=2.2
Requires-Dist: pydantic~=1.4
Provides-Extra: tests
Requires-Dist: pytest~=5.0; extra == "tests"
Requires-Dist: pytest-django~=3.5; extra == "tests"
Requires-Dist: pytest-asyncio~=0.10; extra == "tests"
Requires-Dist: pytest-cov>=2.7; extra == "tests"
Requires-Dist: black>=19.3b0; extra == "tests"
Requires-Dist: flake8>=3.7; extra == "tests"

# django-channels-handlers

[![Latest PyPI
version](https://img.shields.io/pypi/v/django-channels-handlers.svg)](https://pypi.python.org/pypi/django-channels-handlers)
[![image](https://travis-ci.com/joshua-s/django-channels-handlers.svg?branch=master)](https://travis-ci.com/joshua-s/django-channels-handlers)

Django Channels consumers, without the Pain 💊

django-channels-handers is an abstraction
for Django Channels that makes it easy to implement elegant protocols
without having to worry about the communication layer.

## Requirements

- Django>=2.1
- channels~=2.4
- pydantic~=1.4

## Usage

Install django-channels-handlers from
pypi:
```bash
pip install django-channels-handlers
```

Create pydantic models for each message you intend to handle. This
allows the handler to validate the message and parse it into an object.

```python
from pydantic import BaseModel, UUID4
from typing import Dict, Optional
from datetime import datetime


class ChatMessage(BaseModel):
    type: str = "chat.message"
    id: UUID4
    thread: UUID4
    sender: UUID4
    content: str
    data: Optional[Dict] = {}
    created: datetime
```

Create a message handler.

This will first validate and parse a message that matches
handled_types using the corresponding
entry in models. It will then execute the
method specified in handled_types,
passing the newly parsed message object.

```python
from channels_handlers.handlers import MessageHandler
# For async, import AsyncMessageHandler


class ChatHandler(MessageHandler):
    namespace = "chat"
    models = {
        "chat.message": ChatMessage,
    }

    def message(self, message):
        # Some logic with message, e.g. save to database
        pass
```

Import ConsumerHandlerMixin and add it to
your Django Channels consumer. Then, add your custom handler to the
consumer's handler_classes.

```python
from channels_handlers.consumers import ConsumerHandlerMixin
# For async, import AsyncConsumerHandlerMixin
from channels.generic.websocket import JsonWebsocketConsumer


class MyConsumer(ConsumerHandlerMixin, JsonWebsocketConsumer):
    handler_classes = [ChatHandler]
```

## Compatibility

django-channels-handlers is compatible
with Python 3.7+, Django 2.2+, and Django Channels 2.2+.

## License

django-channels-handlers is licensed
under the MIT License.

## Authors

See [AUTHORS.md](AUTHORS.md).

## Contributing

django-channels-handlers relies on the contributions of talented coders like you.
See [CONTRIBUTING.md](CONTRIBUTING.md) for more information.
