Skip to main content

SvelteKit-like file routing and hypermedia runtime for Django

Project description

HyperDjango

Build interactive Django apps without splitting your product into "backend API + SPA frontend".

HyperDjango keeps rendering and business logic on the server, then layers in partial swaps, signals, OOB updates, and transitions for SPA-like UX.

Problem -> Approach -> Outcome

  • Problem: teams duplicate feature logic across Django views, API serializers, and frontend state stores.
  • Approach: treat HTML as the interface, organize features in hyper/, and use actions for incremental updates.
  • Outcome: one feature implementation path with fast interactions and fewer moving parts.

Why This Works

  • Keep business logic in Django, not duplicated across REST + frontend app layers.
  • Get SPA-like interactions (partial swaps, OOB updates, toasts, transitions) with HTML as the transport.
  • Organize by feature using file-based routes and co-located templates/assets.

Locality of Behavior

HyperDjango is centered around a single hyper/ directory where routes, layouts, and frontend entry files live together.

hyper/
  layouts/
    base/
      __init__.py
      index.html
      entry.ts
  routes/
    index/
      page.py
      index.html
      partials/
        flash.html
    todos/
      page.py
      index.html
      partials/
        item.html
  shared/
    __init__.py

Each route folder owns its behavior:

  • page.py: server logic (get/post/@action)
  • index.html: page template
  • partials/*: fragments used by action swaps
  • nearby entry.ts files: route/layout-specific client assets

This keeps the code you change for a feature close together.

What You Get

  • file-based routing from hyper/routes/**/+page.py
  • nested layout.py composition
  • class-based pages with native get/post/... handlers
  • @action methods for hypermedia interactions
  • Alpine-friendly $action(name, data, options) client helper
  • progressive enhancement for links/forms (hyper-nav)
  • native Vite integration (dev server + build manifest)

Install

Package: https://pypi.org/project/hyperdjango/

From PyPI (recommended):

uv add hyperdjango

or:

pip install hyperdjango

Quick Start

  1. Add app + settings:
INSTALLED_APPS = [
    # ...
    "hyperdjango",
]

HYPER_FRONTEND_DIR = BASE_DIR / "hyper"
HYPER_VITE_OUTPUT_DIR = BASE_DIR / "dist"
HYPER_VITE_DEV_SERVER_URL = "http://localhost:5173/"
HYPER_DEV = DEBUG

TEMPLATES[0]["DIRS"].append(HYPER_FRONTEND_DIR)
STATICFILES_DIRS = [HYPER_VITE_OUTPUT_DIR]
  1. Scaffold HyperDjango into your existing project:
python manage.py hyper_scaffold

This generates hyper/ directories (including routes/, templates/, layouts/), starter files, vite.config.js, and package.json dependencies/scripts. By default it also wires your Django settings + urls file. Use --no-wire to skip patching, or --force to overwrite scaffolded files.

  1. If you used --no-wire, mount routes manually in urls.py:
from django.contrib import admin
from django.urls import path
from hyperdjango.urls import include_routes

urlpatterns = [
    path("admin/", admin.site.urls),
    *include_routes(),
]
  1. Run route introspection:
python manage.py hyper_routes

Basic Page

from hyperdjango.page import HyperView


class PageView(HyperView):
    def get(self, request):
        return {"title": "About"}

Place this in hyper/routes/about/+page.py and create hyper/routes/about/index.html.

Note: each hyper/routes/**/+page.py must define a class named PageView (typically inheriting HyperView).

Actions

Use @action for partial updates, signal patches, toasts, OOB updates, and swap control.

from hyperdjango.actions import action
from hyperdjango.page import HyperView


class PageView(HyperView):
    @action
    def add(self, request, title=""):
        html = self.render_block(
            request=request,
            block_name="todo_list",
            context_updates={"items": [title]},
        )
        return self.action_response(
            html=html,
            target="#todo-list",
            swap="inner",
            toast={"type": "success", "message": "Added"},
        )

Use HyperPageTemplate Without Routes

If you do not want file-based URL routing for a feature, create a template package in hyper/templates/** and render it from your own Django view.

from hyperdjango.page import HyperPageTemplate


class ProfileCardTemplate(HyperPageTemplate):
    pass
from hyperdjango.shortcuts import render_template_page


def profile_card(request):
    return render_template_page(request, ProfileCardTemplate, context={"title": "Account"})

Client Runtime

HyperDjango exposes helpers globally and as Alpine magics:

  • window.action(...)
  • Alpine: $action(...)
<div x-data="{ q: '' }">
  <input x-model="q" />
  <button x-on:click="$action('search', { q }, { target: '#results', key: 'search' })">
    Search
  </button>
</div>

Route Naming Conventions

  • routes/index/+page.py -> /
  • routes/about/+page.py -> /about
  • routes/blog/[slug]/+page.py -> /blog/<slug>
  • routes/blog/[str__slug]/+page.py -> /blog/<str:slug>
  • routes/docs/[...path]/+page.py -> /docs/<path:path>
  • routes/accounts/reset/[uidb36]-[key]/+page.py -> /accounts/reset/<uidb36>-<key>
  • routes/account/reset/[uid__[0-9A-Za-z]+]-[key__.+]/+page.py -> inline regex segment
  • routes/(marketing)/pricing/+page.py -> /pricing

Reverse URL names are generated automatically (for example routes/blog/[slug]/+page.py -> hyper_blog_slug) and can be overridden per page with route_name on PageView.

Template Tags

Load tags:

{% load hyper_tags %}

Available tags:

  • hyper_preloads
  • hyper_stylesheets
  • hyper_head_scripts
  • hyper_body_scripts
  • hyper_custom_entry "name"

Docs

Example App

A full runnable demo lives in example/.

  • setup and run instructions: example/README.md
  • includes routes for static, dynamic, catch-all, grouped, nested layouts
  • includes action-heavy examples: /todos, /search, /profile

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

hyperdjango-0.14.1.tar.gz (40.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hyperdjango-0.14.1-py3-none-any.whl (39.6 kB view details)

Uploaded Python 3

File details

Details for the file hyperdjango-0.14.1.tar.gz.

File metadata

  • Download URL: hyperdjango-0.14.1.tar.gz
  • Upload date:
  • Size: 40.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for hyperdjango-0.14.1.tar.gz
Algorithm Hash digest
SHA256 66dfa317a1cc74556fb1923503f82b049d53eb4c030d6594c7bcf7488811a208
MD5 f0b1ddd174e6a65934b4df9c8d796f91
BLAKE2b-256 866af597fbaa5ff1479cac3271dbc2cfeba9b4f5c6717ec03eb2d2f7f554c974

See more details on using hashes here.

File details

Details for the file hyperdjango-0.14.1-py3-none-any.whl.

File metadata

  • Download URL: hyperdjango-0.14.1-py3-none-any.whl
  • Upload date:
  • Size: 39.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for hyperdjango-0.14.1-py3-none-any.whl
Algorithm Hash digest
SHA256 80f55b9ec15f3e1b44f7cef666e306bd5f6ef821daacc5c47b29e0d4c1404cdc
MD5 6c8983152ece5e8969c290b5370caf3a
BLAKE2b-256 d3716027a06718c91e65ba8c78858841b943d5a44efba2a4a02708430a759472

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page