HTMX Utilities

Utilities for handling HTMX requests and responses

Request Detection


source

is_htmx_request


def is_htmx_request(
    request, # FastHTML request object
)->bool: # True if request is from HTMX

Check if a request is an HTMX request.

HTMX requests include the ‘HX-Request’ header set to ‘true’. This is useful for conditionally returning partial HTML vs full pages.

# Example: Check if request is from HTMX
from types import SimpleNamespace

# Mock HTMX request
htmx_request = SimpleNamespace(headers={'HX-Request': 'true'})
print(f"Is HTMX request: {is_htmx_request(htmx_request)}")

# Mock normal request
normal_request = SimpleNamespace(headers={})
print(f"Is HTMX request: {is_htmx_request(normal_request)}")
Is HTMX request: True
Is HTMX request: False

HTMX Request Handler


source

handle_htmx_request


def handle_htmx_request(
    request, # FastHTML request object
    content_fn:Callable, # Function to generate content
    args:VAR_POSITIONAL, # Positional arguments for content_fn
    wrap_fn:Optional=None, # Optional wrapper function for full page requests
    kwargs:VAR_KEYWORD
):

Handle HTMX vs full page response pattern.

This is a common pattern where HTMX requests return just the content, while full page requests wrap the content with page layout.

# Example: Using handle_htmx_request
from types import SimpleNamespace
from fasthtml.common import Div, H1

def my_content():
    return Div(H1("Dashboard Content"))

def my_wrapper(content):
    return Div(
        H1("Site Header"),
        content,
        Div("Footer")
    )

# HTMX request - returns just content
htmx_request = SimpleNamespace(headers={'HX-Request': 'true'})
result = handle_htmx_request(htmx_request, my_content, wrap_fn=my_wrapper)
print("HTMX request result:")
print(result)

# Full page request - returns wrapped content
normal_request = SimpleNamespace(headers={})
result = handle_htmx_request(normal_request, my_content, wrap_fn=my_wrapper)
print("\nFull page request result:")
print(result)
HTMX request result:
<div><h1>Dashboard Content</h1></div>

Full page request result:
<div><h1>Site Header</h1><div><h1>Dashboard Content</h1></div><div>Footer</div></div>