Control the web with Python
Project description
Django IDOM
django-idom
allows you to integrate IDOM into
Django applications. IDOM is a pure Python library inspired by
ReactJS for creating responsive web interfaces.
You can try IDOM now in a Jupyter Notebook:
Install Django IDOM
pip install django-idom
Django Integration
To integrate IDOM into your application you'll need to modify or add the following files to your_project
:
your_project/
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── example_app/
├── __init__.py
├── idom.py
├── templates/
│ └── your-template.html
└── urls.py
asgi.py
Follow the channels
installation guide in
order to create ASGI websockets within Django. Then, we will add a path for IDOM's
websocket consumer using IDOM_WEBSOCKET_PATH
.
Note: If you wish to change the route where this websocket is served from, see the available settings.
import os
from django.core.asgi import get_asgi_application
from django_idom import IDOM_WEB_MODULES_PATH
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_app.settings")
# Fetch ASGI application before importing dependencies that require ORM models.
http_asgi_app = get_asgi_application()
from channels.routing import ProtocolTypeRouter, URLRouter
application = ProtocolTypeRouter(
{
"http": http_asgi_app,
"websocket": URLRouter(
# add a path for IDOM's websocket
[IDOM_WEB_MODULES_PATH]
),
}
)
settings.py
In your settings you'll need to add django_idom
to the
INSTALLED_APPS
list:
INSTALLED_APPS = [
...,
"django_idom",
]
You may configure additional options as well:
# the base URL for all IDOM-releated resources
IDOM_BASE_URL: str = "_idom/"
# Set cache size limit for loading JS files for IDOM.
# Only applies when not using Django's caching framework (see below).
IDOM_WEB_MODULE_LRU_CACHE_SIZE: int | None = None
# Configure a cache for loading JS files
CACHES = {
# Configure a cache for loading JS files for IDOM
"idom_web_modules": {"BACKEND": ...},
# If the above cache is not configured, then we'll use the "default" instead
"default": {"BACKEND": ...},
}
urls.py
You'll need to include IDOM's static web modules path using IDOM_WEB_MODULES_PATH
.
Similarly to the IDOM_WEBSOCKET_PATH
. If you wish to change the route where this
websocket is served from, see the available settings.
from django_idom import IDOM_WEB_MODULES_PATH
urlpatterns = [
IDOM_WEB_MODULES_PATH,
...
]
example_app/components.py
This is where, by a convention similar to that of
views.py
, you'll define
your IDOM components. Ultimately though, you should
feel free to organize your component modules you wish. The components created here will
ultimately be referenced by name in your-template.html
. your-template.html
.
import idom
@idom.component
def Hello(greeting_recipient): # component names are camelcase by convention
return Header(f"Hello {greeting_recipient}!")
example_app/templates/your-template.html
In your templates, you may inject a view of an IDOM component into your templated HTML
by using the idom_component
template tag. This tag which requires the name of a component
to render (of the form module_name.ComponentName
) and keyword arguments you'd like to
pass it from the template.
idom_component module_name.ComponentName param_1="something" param_2="something-else"
In context this will look a bit like the following...
<!-- don't forget your load statements -->
{% load static %}
{% load idom %}
<!DOCTYPE html>
<html>
<body>
...
{% idom_component "your_project.example_app.components.Hello" greeting_recipient="World" %}
</body>
</html>
example_app/views.py
You can then serve your-template.html
from a view just
like any other.
from django.http import HttpResponse
from django.template import loader
def your_view(request):
context = {}
return HttpResponse(
loader.get_template("your-template.html").render(context, request)
)
example_app/urls.py
Include your view in the list of urlpatterns
from django.urls import path
from .views import your_view # define this view like any other HTML template view
urlpatterns = [
path("", your_view),
...
]
Developer Guide
If you plan to make code changes to this repository, you'll need to install the following dependencies first:
- NPM for installing and managing Javascript
- ChromeDriver for testing with Selenium
Once done, you should clone this repository:
git clone https://github.com/idom-team/django-idom.git
cd django-idom
Then, by running the command below you can:
-
Install an editable version of the Python code
-
Download, build, and install Javascript dependencies
pip install -e . -r requirements.txt
Finally, to verify that everything is working properly, you'll want to run the test suite.
Running The Tests
This repo uses Nox to run scripts which can
be found in noxfile.py
. For a full test of available scripts run nox -l
. To run the full test suite simple execute:
nox -s test
To run the tests using a headless browser:
nox -s test -- --headless
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 django_idom-0.0.1.tar.gz
.
File metadata
- Download URL: django_idom-0.0.1.tar.gz
- Upload date:
- Size: 254.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1f961ca93c400cd6a74b5a46be9a60746e4d6495eaf4833e2dac76ca56d760fe |
|
MD5 | 277d0433839fae8be0b9d6efd42a7273 |
|
BLAKE2b-256 | b77250b3a25cd2bca3d2fff53b3111df2da404ab40c5c0428199389dbc66b64f |
File details
Details for the file django_idom-0.0.1-py2.py3-none-any.whl
.
File metadata
- Download URL: django_idom-0.0.1-py2.py3-none-any.whl
- Upload date:
- Size: 257.3 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8bced3a87a2ee386b36b0b310b854950336d15b8ff9ce0f9dc8957146537aae4 |
|
MD5 | f333ca1eff13325d1654a8114f2cbe02 |
|
BLAKE2b-256 | 82b170874eea1007c668723f35d44b695cf3117dae14e44d983a443e54c67627 |