Django Logux integration engine https://logux.io/
Project description
Logux Django
Django Logux integration engine.
- Guide, recipes, and API
- Chat for any questions
- Issues and roadmap
- Projects inside Logux ecosystem
Installation
Install from PyPI
pip install logux-django
Install dev version from current master.
pip install -e git://github.com/logux/django.git#egg=logux_django
Add path(r'logux/', include('logux.urls')),
into your urls.py
Sets Logux settings in your settings.py
:
# Logux settings: https://logux.io/guide/starting/proxy-server/
LOGUX_CONFIG = {
'URL': 'http://localhost:31337/',
'CONTROL_SECRET': 'parole',
'AUTH_FUNC': auth_func, # auth_func(user_id: str, token: str, cookie: dict, headers: dict) -> bool
'SUBPROTOCOL': '1.0.0',
'SUPPORTS': '^1.0.0'
}
Storing passwords or secrets in settings.py
is bad practice. Use ENV.
For urls and settings examples, please checkout test_app
settings
Keep in mind: the path in your urls.py
(logux/
) and the LOGUX_CONTROL_SECRET
from the settings should be passed
into Logux Server by ENV as
LOGUX_BACKEND
and LOGUX_CONTROL_SECRET
respectively.
For example:
LOGUX_BACKEND=http://localhost:8000/logux/
LOGUX_CONTROL_SECRET=secret
Usage
Actions
For action
handling add logux_actions.py
file in your app, add ActionCommand
inheritors and implement all his
abstract methods.
Actions classes requirements:
- Set
action_type: str
- Implement all
ActionCommand
abstracts methods - Implement
resend
andprocess
methods if you need (optional) - import
logux
dispatcher:from logux.dispatchers import logux
- Register all your action handlers:
logux.actions.register(YourAction)
For example – User rename action handler:
import json
from typing import Optional, List
from logux.core import ActionCommand, Meta, Action
from logux.dispatchers import logux
from logux.exceptions import LoguxProxyException
from tests.test_app.models import User
class RenameUserAction(ActionCommand):
""" During the subscription to users/USER_ID channel sends { type: "users/name", payload: { userId, name } }
action with the latest user’s name. """
action_type = 'users/name'
def resend(self, action: Action, meta: Optional[Meta]) -> List[str]:
return [f"users/{action['payload']['userId']}"]
def access(self, action: Action, meta: Meta) -> bool:
if 'error' in self.headers:
raise LoguxProxyException(self.headers['error'])
return action['payload']['userId'] == meta.user_id
def process(self, action: Action, meta: Meta) -> None:
user = User.objects.get(pk=action['payload']['userId'])
first_name_meta = json.loads(user.first_name_meta)
if not first_name_meta or Meta(first_name_meta).is_older(meta):
user.first_name = action['payload']['name']
user.first_name_meta = meta.get_json()
user.save()
logux.actions.register(RenameUserAction)
Channels (Subscription)
For subsription
handling add logux_subsriptions.py
file in your app, and ChannelCommand
inheritors
and implement all his abstract methods.
Subscription classes requirements:
- Set
channel_pattern: str
– this is a regexp like Django's url's patters inurls.py
- Implement all
ChannelCommand
abstracts methods - import
logux
dispatcher:from logux.dispatchers import logux
- Register all your subscription handlers:
logux.channels.register(YourChannelCommand)
For example:
from typing import Optional
from logux.core import ChannelCommand, Action, Meta
from logux.dispatchers import logux
from logux.exceptions import LoguxProxyException
from tests.test_app.models import User
class UserChannel(ChannelCommand):
channel_pattern = r'^users/(?P<user_id>\w+)$'
def access(self, action: Action, meta: Meta) -> bool:
return self.params['user_id'] == meta.user_id
def load(self, action: Action, meta: Meta) -> Action:
if 'error' in self.headers:
raise LoguxProxyException(self.headers['error'])
user, created = User.objects.get_or_create(id=self.params['user_id'])
if created:
user.first_name = 'Name'
return {
'type': 'users/name',
'payload': {'userId': str(user.id), 'name': user.first_name}
}
logux.channels.register(UserChannel)
For more examples, please checkout test app
(tests/test_app)
Utils
logux.core.logux_add
logux_add(action: Action, raw_meta: Optional[Dict] = None) -> None
is low level API function to send any actions and meta into Logux server.
If raw_meta
is None
just empty Dict will be passed to Logux server.
Keep in mind, in the current version logux_add
is sync.
For more information: https://logux.io/node-api/#log-add
Development
Create dev environment
make venv
make install
make run
Type checking and linting:
make lint
Test:
make test
Integration tests (up server and run backend-test):
make integration_test
License
The package is available as open source under the terms of the MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file logux_django-2.0.tar.gz
.
File metadata
- Download URL: logux_django-2.0.tar.gz
- Upload date:
- Size: 17.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 74f237a8fca5f56adceeccce4ec86638370d9276891e8f1c1875e3d7aede6fbd |
|
MD5 | 6c1b3c86469ce683b7266cb53e726bed |
|
BLAKE2b-256 | ef994c408e00ce92c574d729332a746fd181ad5d93a126fbbafc30c0f6cce9e6 |
File details
Details for the file logux_django-2.0-py3-none-any.whl
.
File metadata
- Download URL: logux_django-2.0-py3-none-any.whl
- Upload date:
- Size: 18.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bcde2e2a05c78006b91d96af5c7ddf8e1b2bdbb79d54a69d1cc50425c7cc0e45 |
|
MD5 | ef0b5b9157234ccf26480ecd2bdf3fff |
|
BLAKE2b-256 | d21ceb4cc35c90f0cf2d978b1700be03e9d830bf8686c19b1fff73b8fa87e51e |