Project Icon

fasthx

FastAPI与HTMX集成的高效装饰器库

FastHX是一个集成FastAPI和HTMX的Python库,提供装饰器语法和多种模板引擎支持。该库保留FastAPI路由功能,适用于同步和异步路由,简化了服务器端渲染和HTMX请求处理。FastHX具有易用性和灵活性,适合不同规模的Web应用开发。

测试 代码检查 文档 PyPI 包

源代码https://github.com/volfpeter/fasthx

文档和示例https://volfpeter.github.io/fasthx

FastHX

正确使用 FastAPI 和 HTMX 的方法。

主要特性:

  • 装饰器语法与 FastAPI 的使用方式一致,路由中无需使用未使用的或魔术依赖。
  • 可与任何模板引擎或服务器端渲染库兼容,如 markyp-htmldominate
  • 内置 Jinja2 模板支持(甚至支持多个模板文件夹)。
  • 让渲染引擎可以访问装饰路由的所有依赖项
  • 默认情况下,FastAPI 路由在接收非 HTMX 请求时将正常工作,因此同一路由可以同时提供数据和渲染 HTML。
  • 在路由中设置的响应头在渲染后会保留,符合 FastAPI 的预期行为。
  • 正确的类型提示使得可以将其他(带类型的)装饰器应用于路由。
  • 适用于同步异步路由

安装

该包可在 PyPI 上获取,可以通过以下命令安装:

$ pip install fasthx

示例

有关展示 FastHX 基本用法的完整但简单的示例,请查看 examples 文件夹。

如果你正在寻找更复杂的(Jinja2)示例,包含主动搜索、延迟加载、服务器发送事件、自定义服务器端 HTMX 触发器、对话框以及 TailwindCSS 和 DaisyUI 集成等功能,请查看这个 FastAPI-HTMX-Tailwind 示例

Jinja2 模板

要开始提供 HTML 和 HTMX 请求,你只需创建一个 fasthx.Jinja 实例,并将其 hx()page() 方法用作路由的装饰器。hx() 仅针对 HTMX 请求触发 HTML 渲染,而 page() 无条件渲染 HTML,为你节省一些样板代码。请参阅以下示例代码:

from fastapi import FastAPI
from fastapi.templating import Jinja2Templates
from fasthx import Jinja
from pydantic import BaseModel

# 示例 API 使用的 Pydantic 模型
class User(BaseModel):
    first_name: str
    last_name: str

# 创建应用
app = FastAPI()

# 创建 FastAPI Jinja2Templates 实例,并用它创建一个
# FastHX Jinja 实例,作为你的装饰器
jinja = Jinja(Jinja2Templates("templates"))

@app.get("/")
@jinja.page("index.html")
def index() -> None:
    ...

@app.get("/user-list")
@jinja.hx("user-list.html")
async def htmx_or_data() -> list[User]:
    return [
        User(first_name="John", last_name="Lennon"),
        User(first_name="Paul", last_name="McCartney"),
        User(first_name="George", last_name="Harrison"),
        User(first_name="Ringo", last_name="Starr"),
    ]

@app.get("/admin-list")
@jinja.hx("user-list.html", no_data=True)
def htmx_only() -> list[User]:
    return [User(first_name="Billy", last_name="Shears")]

自定义模板

如果你不喜欢 Jinja 模板,hx()page() 装饰器为你提供了所需的所有灵活性:你可以通过实现 HTMLRenderer 协议将任何 HTML 渲染或模板引擎集成到 fasthx 中。与 Jinja 的情况类似,hx() 仅针对 HTMX 请求触发 HTML 渲染,而 page() 无条件渲染 HTML。请参阅以下示例代码:

from typing import Annotated, Any

from fastapi import Depends, FastAPI, Request
from fasthx import hx, page

# 创建应用
app = FastAPI()

# 创建一个依赖项,以查看其返回值在渲染函数中是否可用
def get_random_number() -> int:
    return 4  # 通过公平的骰子选择

DependsRandomNumber = Annotated[int, Depends(get_random_number)]

# 创建渲染方法:它们必须始终具有这三个参数
# 如果你使用静态类型检查器,`result` 的类型提示必须与
# 使用此渲染方法的路由的返回类型注解匹配
def render_index(result: list[dict[str, str]], *, context: dict[str, Any], request: Request) -> str:
    return "<h1>Hello FastHX</h1>"

def render_user_list(result: list[dict[str, str]], *, context: dict[str, Any], request: Request) -> str:
    # `DependsRandomNumber` 依赖项的值可以通过与路由中相同的名称访问
    random_number = context["random_number"]
    lucky_number = f"<h1>{random_number}</h1>"
    users = "".join(("<ul>", *(f"<li>{u['name']}</li>" for u in result), "</ul>"))
    return f"{lucky_number}\n{users}"

@app.get("/")
@page(render_index)
def index() -> None:
    ...

@app.get("/htmx-or-data")
@hx(render_user_list)
def htmx_or_data(random_number: DependsRandomNumber) -> list[dict[str, str]]:
    return [{"name": "Joe"}]

@app.get("/htmx-only")
@hx(render_user_list, no_data=True)
async def htmx_only(random_number: DependsRandomNumber) -> list[dict[str, str]]:
    return [{"name": "Joe"}]

依赖项

此包的唯一依赖项是 fastapi

开发

使用 ruff 进行代码检查和格式化,mypy 进行静态代码分析,以及 pytest 进行测试。

文档使用 mkdocs-materialmkdocstrings 构建。

贡献

欢迎所有贡献。

贡献者

许可证 - MIT

该包在 MIT 许可证 条款下开源。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号