Skip to main content

asgi-htmx

Build Status Coverage Package version

HTMX integration for ASGI applications. Works with Starlette, FastAPI, Quart -- or any other web framework supporting ASGI that exposes the ASGI scope. Inspired by django-htmx.

Table of contents

Installation

NOTE: This is alpha software. Please be sure to pin your dependencies.

pip install asgi-htmx==0.1.*

Quickstart

First, ensure HTMX is installed.

For example, download a copy of htmx.min.js, add it to your static files, then add the script tag to templates:

<script src="{{ url_for('static', path='/js/htmx.min.js') }}" defer></script>

Now, install HtmxMiddleware onto the ASGI app:

  • Using Starlette:

    from asgi_htmx import HtmxMiddleware
    from starlette.middleware import Middleware
    
    app = Starlette(
        middleware=[
            ...,
            Middleware(HtmxMiddleware),
            ...,
        ],
    )
    
  • Using FastAPI:

    from asgi_htmx import HtmxMiddleware
    from fastapi import FastAPI
    
    app = FastAPI()
    app.add_middleware(HtmxMiddleware)
    

You can now access scope["htmx"] (an instance of HtmxDetails) in endpoints:

# `HtmxRequest` makes code editors type-check `request.scope["htmx"]`
from asgi_htmx import HtmxRequest as Request

from .resources import templates

async def home(request: Request):
    template = "home.html"
    context = {"request": request}

    if (htmx := request.scope["htmx"]):
        template = "partials/items.html"
        context["boosted"] = htmx.boosted  # ...

    return templates.TemplateResponse(template, context)

See examples for full working example code.

API Reference

HtmxMiddleware

An ASGI middleware that sets scope["htmx"] to an instance of HtmxDetails (scope refers to the ASGI scope).

app = HtmxMiddleware(app)

HtmxDetails

A helper that provides shortcuts for accessing HTMX-specific request headers.

htmx = HtmxDetails(scope)
  • __bool__() -> bool - Return True if the request was made using HTMX (HX-Request is present), False otherwise.
  • boosted: bool - Mirrors the HX-Boosted header: True if the request is via an element with the hx-boost attribute.
  • current_url: str | None - Mirrors the HX-Current-URL header: The current URL of the browser, or None for non-HTMX requests.
  • history_restore_request: str - Mirrors the HX-History-Restore-Request header: True if the request is for history restoration after a miss in the local history cache.
  • prompt: str | None - Mirrors HX-Prompt: The user response to hx-prompt if it was used, or None.
  • target: str | None - Mirrors HX-Target: The id of the target element if it exists, or None.
  • trigger: str | None - Mirrors HX-Trigger: The id of the trigger element if it exists, or None.
  • trigger_name: str | None - Mirrors HX-Trigger-Name: The name of the trigger element if it exists, or None.
  • triggering_event: Any | None - Mirrors Triggering-Event, which is set by the event-header extension: The deserialized JSON representation of the event that triggered the request if it exists, or None.

HtmxRequest

For Starlette-based frameworks, use this instead of the standard starlette.requests.Request so that code editors understand that request.scope["htmx"] contains an HtmxDetails instance:

from asgi_htmx import HtmxRequest as Request

async def home(request: Request):
    reveal_type(request.scope["htmx"])  # Revealed type is 'HtmxDetails'

License

MIT

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog.

0.1.0 - 2022-05-30

Initial release

Added

  • Add HtmxDetails that facilitates working with HX-* request headers.
  • Add HtmxMiddleware that automatically adds an HtmxDetails instance as scope["htmx"].
  • Add HtmxRequest that facilitates type hinting request.scope["htmx"] in Starlette-based frameworks.

Metadata

Release files for asgi-htmx 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for asgi-htmx 0.1.0
File Size Uploaded
asgi-htmx-0.1.0.tar.gz 24.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for asgi-htmx 0.1.0
File Interpreter ABI Platform
asgi_htmx-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 31.3 kB

Release files / asgi-htmx-0.1.0.tar.gz

Download URL asgi-htmx-0.1.0.tar.gz
Size 24.9 kB
Tags Source
SHA-256 checksum
How to use checksums
3c6cb1419f05d53ea593bfe684c88b4941b22063c7628720ec99de9197587623
BLAKE2b-256 checksum
How to use checksums
ab6bd013c1e0fd6de4f8fbbc253d74766df50146bacfee856093722f10d30a2e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.0 CPython/3.10.4

Release files / asgi_htmx-0.1.0-py3-none-any.whl

Download URL asgi_htmx-0.1.0-py3-none-any.whl
Size 6.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
622a98b5c31a8b9857de6a5a9cd97d584b0ee21b88e0a8a56dc237d172b75c9b
BLAKE2b-256 checksum
How to use checksums
3bc75490c81826f003038fab6047384ac77fd848296453e6dd0784b055ebba41
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.0 CPython/3.10.4

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page