Skip to main content

HTMX integration for ASGI applications.

Project description

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.

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

asgi-htmx-0.1.0.tar.gz (24.9 kB view details)

Uploaded Source

Built Distribution

asgi_htmx-0.1.0-py3-none-any.whl (6.4 kB view details)

Uploaded Python 3

File details

Details for the file asgi-htmx-0.1.0.tar.gz.

File metadata

  • Download URL: asgi-htmx-0.1.0.tar.gz
  • Upload date:
  • Size: 24.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.10.4

File hashes

Hashes for asgi-htmx-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3c6cb1419f05d53ea593bfe684c88b4941b22063c7628720ec99de9197587623
MD5 22d078e9623e0abe14c1dd56ccc9f8c3
BLAKE2b-256 ab6bd013c1e0fd6de4f8fbbc253d74766df50146bacfee856093722f10d30a2e

See more details on using hashes here.

File details

Details for the file asgi_htmx-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: asgi_htmx-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 6.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.10.4

File hashes

Hashes for asgi_htmx-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 622a98b5c31a8b9857de6a5a9cd97d584b0ee21b88e0a8a56dc237d172b75c9b
MD5 dbb335f83765d2a5ad082ba46f4f1478
BLAKE2b-256 3bc75490c81826f003038fab6047384ac77fd848296453e6dd0784b055ebba41

See more details on using hashes here.

Supported by

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