跳转到主要内容

为ASGI应用程序提供的HTMX集成。

项目描述

asgi-htmx

Build Status Coverage Package version

HTMXASGI 应用程序提供的集成。适用于 Starlette、FastAPI、Quart - 或任何其他支持ASGI并公开ASGI scope的Web框架。受 django-htmx 启发。

目录

安装

注意:这是alpha软件。请确保固定您的依赖关系。

pip install asgi-htmx==0.1.*

快速入门

首先,确保 HTMX已安装

例如,下载一份 htmx.min.js 的副本,将其添加到您的 静态文件 中,然后在模板中添加脚本标签

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

现在,将 HtmxMiddleware 安装到ASGI应用程序中

  • 使用Starlette

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

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

您现在可以访问 scope["htmx"](一个 HtmxDetails 的实例)在端点上

# `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)

请参阅 示例 以获取完整的工作示例代码。

API参考

HtmxMiddleware

一个ASGI中间件,将 scope["htmx"] 设置为 HtmxDetails 的一个实例(scope 指的是ASGI范围)。

app = HtmxMiddleware(app)

HtmxDetails

一个助手,提供对HTMX特定的 请求头 的快捷访问。

htmx = HtmxDetails(scope)
  • __bool__() -> bool - 如果请求使用HTMX(存在 HX-Request),则返回 True,否则返回 False
  • boosted: bool - 反映 HX-Boosted 头:如果请求通过具有 hx-boost 属性的元素,则返回 True
  • current_url: str | None - 反映 HX-Current-URL 头:浏览器的当前URL,对于非HTMX请求为 None
  • history_restore_request: str - 与 HX-History-Restore-Request 头部对应:如果请求是本地历史缓存失效后的历史恢复,则为 True
  • prompt: str | None - 与 HX-Prompt 对应:如果使用了 hx-prompt,则为用户响应,否则为 None
  • target: str | None - 与 HX-Target 对应:如果存在,则为目标元素的 id,否则为 None
  • trigger: str | None - 与 HX-Trigger 对应:如果存在,则为触发元素的 id,否则为 None
  • trigger_name: str | None - 与 HX-Trigger-Name 对应:如果存在,则为触发元素的 name,否则为 None
  • triggering_event: Any | None - 与 Triggering-Event 对应,由 event-header 扩展 设置:如果存在,则为触发请求的事件的序列化 JSON 表示形式,否则为 None

HtmxRequest

对于基于 Starlette 的框架,使用此代替标准的 starlette.requests.Request,以便代码编辑器理解 request.scope["htmx"] 包含一个 HtmxDetails 实例。

from asgi_htmx import HtmxRequest as Request

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

许可证

MIT

变更日志

此项目的所有重大更改都将记录在此文件中。

格式基于 Keep a Changelog

0.1.0 - 2022-05-30

初始版本

添加

  • 添加 HtmxDetails,它有助于处理 HX-* 请求头部。
  • 添加 HtmxMiddleware,它将自动将 HtmxDetails 实例添加为 scope["htmx"]
  • 添加 HtmxRequest,它有助于在基于 Starlette 的框架中为 request.scope["htmx"] 提供类型提示。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。

源分布

asgi-htmx-0.1.0.tar.gz (24.9 kB 查看哈希值)

上传时间

构建分布

asgi_htmx-0.1.0-py3-none-any.whl (6.4 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面