

大家好,我是 Ai 学习的老章
在当今的 Web 开发领域,我们早已习惯了复杂的技术栈。构建一个现代化的交互式应用,往往意味着要在前端(JavaScript、CSS、HTML 及其框架如 React/Vue)和后端(Python/Java/Go 等)之间不断切换,同时还要掌握模板语言、打包工具、API 设计等一系列繁杂的知识。这种复杂性不仅拉高了学习曲线,也让许多非全职的开发者,尤其是来自数据科学和 AI 领域的专家们望而却却步。
有没有一种更简单、更直观的方式?fasthtml 给出了一个响亮的回答。
它是一个革命性的 Python Web 框架,旨在让你用纯粹的 Python 构建从简单到复杂的全栈 Web 应用,彻底告别“前端/后端分离”带来的割裂感。
本文将根据 fasthtml 的官方文档和示例,带你深入了解这个框架的设计哲学、核心功能,并通过一系列图文并茂的实例,展示如何用它快速、高效地将你的想法变为现实。
fasthtml 由知名 AI 教育家、fast.ai 创始人 Jeremy Howard 在 Answer.AI 领导开发。它的诞生并非一时兴起,而是源于对现代 Web 开发复杂性的深刻反思。其核心理念可以总结为以下几点:
fasthtml 并非要重新发明轮子,而是巧妙地站在了巨人的肩膀上。它构建于 Python、Starlette (高性能 ASGI 框架)、Uvicorn (闪电般快速的 ASGI 服务器) 和 HTMX (增强 HTML 的前端库) 这些坚实的基础之上。这使得 fastht.ml 的核心代码异常精简(不足 1000 行),却功能强大。fasthtml 允许你直接在 Python 代码中构建 HTML 结构。这意味着你不再需要在 Python 逻辑和 HTML 模板之间来回切换,所有逻辑、结构和内容都在同一个地方,极大地提升了开发效率和代码的可维护性。fasthtml 的“魔法”很大程度上来源于其深度集成的 HTMX[1]。HTMX 允许任何 HTML 元素(而不仅仅是 <a> 和 <form>)向服务器发送请求,并用服务器返回的 HTML 片段更新页面的任何部分,而无需刷新整个页面。这种“超媒体”方法让你无需编写一行 JavaScript,就能实现丰富的动态交互效果。fasthtml 的终极目标是让更多人,特别是那些拥有出色想法但非专业程序员背景的“新一代开发者”,能够轻松地将他们的 AI 模型或数据项目转化为可用的 Web 应用。fasthtml 应用理论说再多,不如亲手一试。让我们看看创建一个 fasthtml 应用有多简单。
首先,通过 pip 安装:
pip install python-fasthtml
然后,创建一个 main.py 文件,写入以下代码:
from fasthtml.common import *
# 初始化应用和路由
app, rt = fast_app()
# 定义根路由 ('/')
@rt('/')
def get():
return Div(P('Hello World!'), hx_get="/change")
# 定义 '/change' 路由
@rt('/change')
def get():
return P('Nice to be here!')
# 启动服务
serve()
在终端运行 python main.py,你将看到服务器启动并提示应用运行在 http://localhost:5001。访问这个地址,你会看到“Hello World!”,点击它,文字会立刻变成“Nice to be here!”——恭喜你,你已经构建了一个动态的 Web 应用!
在这个例子中:
fast_app() 创建了应用实例和路由装饰器。@rt('/') 定义了根 URL 的处理器。Div 和 P 等 Python 对象,它们会被自动转换为 HTML。hx_get="/change" 是 HTMX 的属性,它告诉浏览器:当这个 Div 被点击时,向 /change 发送一个 GET 请求,然后用返回的内容替换自己。fasthtml 借助 fastcore.xml 库,将所有标准 HTML 标签(如 Div, P, A, Img, Form, Input 等)都变成了 Python 中的类。你可以像嵌套函数调用一样来构建复杂的 HTML 结构。
from fasthtml.common import *
page = Html(
Head(Title('My Awesome Page')),
Body(
Div('Some text, ',
A('A link', href='https://example.com'),
Img(src="https://placehold.co/200"),
cls='my-container' # 'cls' 用于添加 CSS class
)
)
)
这种方式的好处是显而易见的:
hx-* 属性HTMX 是 fasthtml 实现动态交互的秘密武器。你只需要在 Python 生成的 HTML 标签上添加一些特殊的 hx-* 属性即可。
hx-get, hx-post, hx-put, hx-delete: 指定点击或触发时,向哪个 URL 发送何种类型的请求。hx-trigger: 指定触发事件,默认为 click,也可以是 mouseenter, every 1s (轮询) 等。hx-target: 指定服务器返回的 HTML 片段应该更新哪个元素(使用 CSS 选择器,如 #my-div)。如果未指定,默认更新触发请求的元素自身。hx-swap: 指定如何更新目标元素。常用值包括:innerHTML (默认): 替换目标元素的内部内容。outerHTML: 整个替换目标元素。beforeend: 在目标元素的末尾追加内容。afterbegin: 在目标元素的开头插入内容。fasthtml 的强大之处不仅在于简化了前后端交互,更在于其灵活的组件化思想。官网首页的几个小例子很好地诠释了这一点:
独立组件 (card_3d.py): 你可以创建完全独立的组件,其行为(JavaScript)和样式(CSS)被封装在组件内部,互不干扰。这使得构建复杂界面和维护代码变得更加容易。
def card_3d(text, background, amt, left_align):
# JS 和 CSS 可以被内联定义或从文件中加载
scr = ScriptX('card3d.js', amt=amt)
sty = StyleX('card3d.css', background=f'url({background})', align=align)
return Div(text, Div(), sty, scr)
动态内容 (weather.py): fasthtml 可以轻松地与异步任务和外部 API 集成。例如,你可以编写一个 async 函数来获取实时天气数据,并将其动态渲染成一个 HTML 表格,整个过程都在 Python 中完成。
async def weather_table():
# 调用 weather.gov 的实时天气数据
results = await all_weather()
rows = [Tr(Td(city), *map(Td, d.values())) for city,d in results.items()]
return Table(Thead(...), *rows)
可复用 UI (accordion.py): 你可以像封装 Python 函数一样封装可复用的 UI 组件,例如一个手风琴折叠菜单。这些组件甚至可以打包并通过 pip 进行安装,在不同项目中共享。
fasthtml 的官方教程提供了几个非常棒的例子,展示了如何用它构建功能完善的应用。
fasthtml 的教程通过一个经典的 ToDo 应用来展示其核心功能,包括数据库集成、动态更新和组件化渲染。通过 htmx,用户可以添加、编辑和删除待办事项,所有操作都会实时反映在页面上,无需刷新整个页面。

fasthtml ToDo 应用示例
fasthtml 非常适合快速构建 AI 应用的原型。官方示例中包含一个 AI Pictionary(你画我猜)游戏,用户在画布上绘图,后端 AI 模型(如 Anthropic's Haiku)会实时猜测图画内容并返回俳句或答案。这完美展示了 fasthtml 如何结合自定义 JavaScript 和后端 AI 服务,创建一个有趣的交互式应用。

Pictionary AI 游戏示例
该示例不仅能实现游戏逻辑,还能调用 AI 模型对用户的绘画作品进行艺术创作,例如生成一首俳句(Haiku):

AI 生成俳句示例
这是一个经典的场景:用户输入一段文本提示(prompt),应用调用 AI 模型生成图片并展示出来。由于 AI 生成耗时较长,这恰好能展示 fasthtml 处理异步任务和轮询更新的能力。
UI 界面: 一个输入框、一个“生成”按钮,以及一个用于显示结果的区域。
# 主页路由
@app.get("/")
def get():
inp = Input(id="new-prompt", name="prompt", placeholder="Enter a prompt")
add = Form(Group(inp, Button("Generate")),
hx_post="/", # 提交表单时 POST 到根目录
target_id='gen-list', # 更新 ID 为 'gen-list' 的元素
hx_swap="afterbegin") # 在列表开头插入新内容
gen_list = Div(id='gen-list')
return Title('Image Generation Demo'), Main(H1('Magic Image Generation'), add, gen_list, cls='container')
核心逻辑: 当用户提交表单后,后端需要:
hx-trigger='every 1s' 定期轮询一个检查状态的接口。<img> 标签,替换掉占位符。代码片段:
# 占位符/结果组件
def generation_preview(id):
if os.path.exists(f"gens/{id}.png"): # 检查图片是否已生成
return Div(Img(src=f"/gens/{id}.png"), id=f'gen-{id}')
else:
# 返回一个每秒轮询一次的占位符
return Div("Generating...", id=f'gen-{id}',
hx_post=f"/generations/{id}",
hx_trigger='every 1s',
hx_swap='outerHTML')
# 表单提交处理
@app.post("/")
def post(prompt:str):
id = len(generations)
generate_and_save(prompt, id) # @threaded 装饰器使其在后台运行
generations.append(prompt)
return generation_preview(id) # 立即返回占位符
这个模式非常强大,让你能够以极其简单和声明式的方式处理复杂的异步 UI 更新。
fasthtml 并不局限于自带的样式,你可以轻松集成任何 CSS 框架,比如流行的 TailwindCSS 和 DaisyUI。
目标:构建一个类似 ChatGPT 的聊天界面,用户的消息在右边,AI 的消息在左边。

fasthtml Chatbot 示例
集成方式:
<head> 中。fasthtml 的 Python 类进行重写,封装成一个 ChatMessage 组件。代码片段:
# 加载 CSS 框架
headers = (
Script(src="https://cdn.tailwindcss.com"),
Link(rel="stylesheet", href="https://cdn.jsdelivr.net/npm/daisyui@latest/dist/full.min.css")
)
# 聊天消息组件
def ChatMessage(msg):
is_user = msg['role'] == 'user'
# 根据角色决定样式和位置 (chat-end vs chat-start)
return Div(
Div(msg['role'], cls="chat-header"),
Div(msg['content'], cls=f"chat-bubble chat-bubble-{'primary' if is_user else 'secondary'}"),
cls=f"chat chat-{'end' if is_user else 'start'}"
)
# 渲染整个聊天记录
messages = [
{"role":"user", "content":"Hello"},
{"role":"assistant", "content":"Hi, how can I assist you?"}
]
chatbox = Div(*[ChatMessage(msg) for msg in messages], cls="chat-box", id="chatlist")
通过这种方式,你可以利用丰富的第三方 UI 库,快速构建出美观且专业的界面,而这一切依然是在纯 Python 环境中完成的。
对于需要实时、双向通信的场景(如在线游戏、协同编辑),HTTP 轮询就不够高效了。fasthtml 对 WebSocket 提供了一流的支持。
目标:创建一个多人在线的“康威生命游戏”。当一个玩家点击网格时,所有在线的玩家都能立刻看到变化。
实现逻辑:
hx-put 请求通知服务器状态变更。这种“HTTP 请求触发 -> WebSocket 广播更新”的模式,是实现实时协作应用的黄金法则,而 fasthtml 将其实现得异常简单。
fasthtml 提供了一个无需深入学习现代前端框架(如 React, Vue)就能构建功能完善的 Web 应用的途径。htmx 的强大功能无缝集成到 Python 中,通过简单的 Python 函数就能实现复杂的动态交互,极大地降低了全栈开发的门槛。Starlette 和 Uvicorn,fasthtml 具备异步、高性能的特性,足以应对生产环境的需求。fasthtml 是比 Streamlit 或 Gradio 更灵活、更接近生产 Web 应用形态的选择。fasthtml 应用本质上是标准的 ASGI 应用,因此你可以将 fastht.ml 应用部署到任何支持 Python 的平台。官方文档特别提到了以下几个对开发者友好的平台,它们通常提供便捷的部署流程:
fastht.ml 应用,实现一键部署,非常适合学习和快速实验。fastht.ml 应用部署在任何支持 ASGI 的服务器或平台上,如 Vercel、PythonAnywhere 或任何云服务器(VPS)。fasthtml 不仅仅是一个新的 Web 框架,它代表了一种返璞归真的开发哲学。通过将现代 Web 开发的最佳实践(如组件化、响应式 UI)与 Python 的简洁和强大相结合,它成功地将构建全栈应用的复杂性降低了一个数量级。
无论你是一位希望快速将 AI 模型产品化的数据科学家,一位厌倦了前后端分离的资深开发者,还是一位刚刚踏入编程世界的新手,fastht.ml 都为你提供了一条通往创造的捷径。它让你能够专注于业务逻辑本身,而不是被繁琐的技术细节所困扰。
参考资料
[1]
HTMX: https://htmx.org/