Python入門構建網頁

用純 Python 構建 Web 應用

本教程將帶你從零開始,構建一個交互式的待辦事項清單。

fasthtml 的核心哲學是“回歸初心,大道至簡”。在當今復雜的前后端分離技術棧中 ,它提供了一條返璞歸真的路徑,旨在讓你能用純粹的 Python 構建從簡單到復雜的全棧 Web 應用,徹底告別“前端/后端分離”帶來的割裂感。

第一步:環境準備與項目初始化

首先,我們需要安裝 fasthtml。它基于 Starlette 和 Uvicorn,性能卓越。

打開你的終端(CMDPowerShellTerminal)并運行以下命令:

pip install python-fasthtml

安裝完成后,創建一個名為 todo_app.py 的文件,準備編寫代碼。

第二步:Python代碼

# -*- coding: utf-8 -*-# ==============================================================================
# 1. 導入與初始化 (Imports & Initialization)
# ==============================================================================
# 從 fasthtml.common 導入所有核心組件。
# fasthtml 巧妙地借助 fastcore.xml 庫,將所有標準HTML標簽(如Div, P, Form)都變成了Python中的類。
# 這讓你可以在純 Python 代碼中直接構建 HTML 結構,無需使用模板語言。
from fasthtml.common import *# AttrDict 允許我們用 `todo.task` 這樣的屬性訪問方式替代 `todo['task']`,讓代碼更優雅。
from fastcore.utils import *# `fast_app()` 會創建應用實例和路由裝飾器。
# app 是一個基于 Starlette 的高性能 ASGI 應用實例。
# rt 是路由對象,用于將 URL 路徑(如'/')與處理函數關聯起來。
app, rt = fast_app()# ==============================================================================
# 2. 數據存儲 (Data Store)
# ==============================================================================
# 使用帶唯一ID的列表來存儲數據。
# 原始代碼使用 list.index(),當任務重名時會導致錯誤。唯一ID是更健壯的實踐。
todos = []
next_id = 0# ==============================================================================
# 3. 組件化渲染 (Componentized Rendering)
# ==============================================================================
# 將UI元素封裝成函數是 fasthtml 的核心優勢之一,這極大地促進了代碼的復用和組件化。
# 這個函數就是一個可復用的 “ToDo Item” 組件。
def render_todo(todo: AttrDict):"""根據傳入的 todo 對象,生成對應的 HTML 列表項 <li>。"""return Li(Div(# --- HTMX 驅動的動態交互 ---# HTMX 是 fasthtml 實現動態交互的秘密武器。# 它讓任何HTML元素都能向服務器發請求,并用返回的HTML片段更新頁面局部,無需刷新。Input(type="checkbox",checked=todo.done,# hx-post: 點擊時,向指定URL發送POST請求。hx_post=f"/toggle/{todo.id}",# hx-target: 指定服務器返回的HTML應該更新哪個元素(使用CSS選擇器)。# 'closest li' 表示“找到最近的父級<li>元素”。hx_target="closest li",# hx-swap: 指定如何更新目標元素。# 'outerHTML' 表示用返回的內容完整替換整個目標元素(包括<li>標簽自身)。hx_swap="outerHTML",cls="mr-2"),Span(todo.task, cls=("line-through text-gray-500" if todo.done else "")),Button("?",# hx-delete: 點擊時發送 DELETE 請求。hx_delete=f"/delete/{todo.id}",hx_target="closest li",# hx-swap='delete': 一個特殊值,它會直接將目標元素從頁面移除。hx_swap="delete",cls="text-red-500 ml-auto"),cls="flex items-center py-2 border-b"))# ==============================================================================
# 4. 頁面路由 (Page Routes)
# ==============================================================================
@rt('/')
def get():"""定義根路由('/')的處理器,返回構成整個頁面的Python對象。"""return Html(Head(Title('FastHTML ToDo App'),# 引入 Tailwind CSS。fasthtml 可以輕松集成任何CSS框架,如 DaisyUI。Script(src="https://cdn.tailwindcss.com"),# 引入 HTMX 庫本身。這是實現所有 "hx-*" 魔法的基礎。Script(src="https://unpkg.com/htmx.org@1.9.12"),),Body(Div(H1("我的 FastHTML 待辦事項", cls="text-2xl font-bold mb-4 text-center"),Form(Input(type="text", name="task", placeholder="輸入新任務...", required=True, cls="border p-2 mr-2 flex-grow"),Button("添加任務", type="submit", cls="bg-blue-500 text-white p-2 rounded hover:bg-blue-600"),# 提交表單時,向 /add URL 發送 POST 請求。hx_post="/add",# 返回的HTML片段將被插入到 id="todo-list" 的元素中。hx_target="#todo-list",# 'beforeend' 表示在目標元素的末尾追加內容。hx_swap="beforeend",# 請求成功后清空輸入框,提升用戶體驗。hx_on="htmx:afterRequest: this.reset()",cls="flex mb-8"),# 初始加載時,渲染所有已存在的待辦事項。# 這里的列表推導式完美體現了邏輯與視圖的統一。Ul([render_todo(t) for t in todos], id="todo-list"),cls="container mx-auto p-8 max-w-lg bg-white rounded-lg shadow-lg mt-10"),cls="bg-gray-100"))# ==============================================================================
# 5. API 路由 (API Routes for HTMX)
# 這些路由只返回 HTML 片段,供 HTMX 進行局部更新。
# ==============================================================================
@rt('/add')
def post(task: str):"""處理添加任務的請求。FastHTML 會自動將表單字段'task'映射到函數參數。"""global next_idnew_todo = AttrDict(id=next_id, task=task, done=False)todos.append(new_todo)next_id += 1# 僅返回新任務的HTML片段,HTMX會將其追加到列表中。return render_todo(new_todo)@rt('/toggle/{id:int}')
def post(id: int):"""根據ID切換任務的完成狀態。"""todo = next((t for t in todos if t.id == id), None)if todo:todo.done = not todo.done# 返回更新后的任務HTML,HTMX會用它替換掉舊的列表項。return render_todo(todo)return ""@rt('/delete/{id:int}')
def delete(id: int):"""根據ID刪除任務。"""todo_to_delete = next((t for t in todos if t.id == id), None)if todo_to_delete:todos.remove(todo_to_delete)# 對于 hx-swap="delete",只需返回一個HTTP 200 OK的空響應即可。return ""# ==============================================================================
# 6. 啟動服務 (Run the Server)
# ==============================================================================
if __name__ == "__main__":# 啟動 Uvicorn 服務器來運行我們的 ASGI 應用。serve()

第三步:運行你的應用

  1. 保存好 todo_app.py 文件。
  2. 在終端中,確保你位于該文件所在的目錄。
  3. 執行命令:
    python todo_app.py
    
  4. 你會看到服務器啟動的提示。
  5. 在瀏覽器中打開 http://localhost:5001 (或其他端口),你將看到你的應用界面。

第四步:為什么選擇 fasthtml

fasthtml 的優勢非常明確:

  • 純粹的 Python:為 Python 開發者,尤其是后端和數據科學家,提供了一條無需深入學習前端框架(如 React, Vue)就能構建全功能 Web 應用的捷徑。
  • 簡化但強大:它將 htmx 的強大功能無縫集成到 Python 中,通過簡單的函數調用實現復雜的動態交互,極大地降低了全棧開發的門檻。
  • 性能優異:基于 Starlette 和 Uvicorn,具備處理生產環境需求的異步和高性能特性。
  • 快速原型驗證:對于需要快速將 AI 模型等想法轉化為可交互原型的場景,fasthtml 是比 Streamlit 或 Gradio 更靈活、更接近生產形態的選擇。

第五步:下一步探索與部署上線

ToDo 應用現在已經在本地運行了。接下來,你可以嘗試:

  1. 功能擴展:添加“編輯”功能,這會涉及到 hx-get(獲取編輯表單)和 hx-put(提交更新)。
  2. 異步任務:嘗試集成一個外部 API。或者像 AI 圖片生成示例一樣 ,處理耗時任務,并使用 hx-trigger='every 1s' 進行輪詢。
  3. 實時通信:對于需要多人協作的應用,可以研究 fasthtml 對 WebSocket 的一流支持。

部署你的應用

fasthtml 應用是標準的 ASGI 應用,可以部署到任何支持 Python 的平臺

  • Railway:通過 Git 自動化部署,非常適合小型項目。
  • Replit:一個在線 IDE,可以在瀏覽器中一鍵開發和部署,適合學習和實驗。
  • HuggingFace Spaces:如果你在構建 AI 應用或模型 Demo,這是理想選擇,它提供了優化的環境和免費計算資源。
  • 其他:你也可以使用 Vercel、PythonAnywhere 或任何云服務器(VPS)進行傳統部署。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93099.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93099.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93099.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開源 Arkts 鴻蒙應用 開發(九)通訊--tcp客戶端

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

Go的defer和recover

在 Go 語言中&#xff0c;defer 和 recover 是兩個緊密相關的關鍵字&#xff0c;主要用于錯誤處理和資源清理。它們通常一起使用&#xff0c;特別是在處理panic&#xff08;運行時崩潰&#xff09;時&#xff0c;確保程序不會直接崩潰&#xff0c;而是能夠優雅地恢復并繼續執行…

Spring Boot 配置文件常用配置屬性詳解(application.properties / application.yml)

前言 Spring Boot 的一大優勢就是通過簡單的配置文件即可快速定制應用行為&#xff0c;而無需編寫大量 XML 配置或 Java 代碼。Spring Boot 使用 application.properties 或 application.yml 作為核心配置文件&#xff0c;支持豐富的配置屬性。 本文將詳細介紹 Spring Boot 常用…

uni-appDay02

1.首頁-通用輪播組件 輪播圖組件需要再首頁和分類頁使用&#xff0c;封裝成通用組件 準備組件自動導入組件 <script setup lang"ts"> import XtxSwiper from /components/XtxSwiper.vue import CustomNavbar from ./components/CustomNavbar.vue </scrip…

FastAPI入門:請求體、查詢參數和字符串校驗、路徑參數和數值校驗

請求體 FastAPI 使用請求體從客戶端&#xff08;例如瀏覽器&#xff09;向 API 發送數據。請求體是客戶端發送給 API 的數據。響應體是 API 發送給客戶端的數據。 使用 Pydantic 模型聲明請求體&#xff0c;能充分利用它的功能和優點 from fastapi import FastAPI from pydanti…

Docker的docker-compose類比Spring的ApplicationContext

總一句話是&#xff1a;Docker Compose&#xff1a;集中化管理多個容器及其依賴的資源環境&#xff1b;ApplicationContext&#xff1a;集中化管理 多個Bean 及其運行所需的資源和依賴關系。 1. 整體概念 Docker Compose&#xff1a;用于定義和運行多容器 Docker 應用程序&…

Reason-before-Retrieve(CVPR 2025)

研究方向&#xff1a;Image Captioning論文全名&#xff1a;《Reason-before-Retrieve: One-Stage Reflective Chain-of-Thoughts for Training-Free Zero-Shot Composed Image Retrieval》1. 論文介紹組合圖像檢索&#xff08;CIR&#xff09;旨在檢索與參考圖像密切相似的目標…

Idefics2:構建視覺-語言模型時,什么是重要的

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" Idefics2&#xff1a;構建視覺-語言模型時&#xff0c;什么是重要的 摘要 隨著large language models和vision transformers的進步&#xff0c;視覺-語言模型&#xff08;VLMs&#xff09;受到了越來越多的關注…

再談fpga開發(fpga調試方法)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】我們之前在學校學習c、c的時候&#xff0c;其實學校漏掉了很重要的一個教學環節&#xff0c;那就是調試、測試。很多時候我們代碼寫出來了&#xff…

C語言中的數據結構--棧和隊列(1)

前言本屆開始我們將對數據結構中棧的內容進行講解,那么廢話不多說,我們正式進入今天的學習棧棧是一種很特殊的線性表&#xff0c;它只能在固定的一端進行插入和刪除操作&#xff0c;進行數據的插入和刪除的一端叫做棧頂&#xff0c;另外一端叫做棧底&#xff0c;棧中的元素遵守…

字符串是數據結構還是數據類型?

比較糾結的一個問題&#xff0c;以下是在網上查到后總結的&#xff0c;不知道對不對&#xff0c;歡迎討論。這是個觸及計算機科學核心概念的精妙問題&#xff01;字符串既可以被視為一種數據類型&#xff0c;也可以被視為一種數據結構&#xff0c;這取決于你觀察的視角和討論的…

Cline與Cursor深度實戰指南:AI編程助手的革命性應用

引言 在AI編程工具快速發展的今天&#xff0c;Cline和Cursor作為兩款備受矚目的AI編程助手&#xff0c;正在重新定義開發者的工作方式。作為一名深度使用這兩款工具的開發者&#xff0c;我在過去一年的實踐中積累了豐富的經驗和獨到的見解。本文將從技術角度深入分析Cline和Cur…

根本是什么

根本是什么 根本沒有了&#xff0c;枝葉還在么&#xff1f; 沒有了內涵&#xff0c;外延還有么&#xff1f; 丟棄了根本&#xff0c;再嗨也是無意義&#xff0c;無根據空虛之樂罷了。 人之所行所言所思所想所念皆欲念、歷程感懷&#xff0c;情思。所謂得失過往&#xff0c;時空…

springboot基于Java的人力資源管理系統設計與實現

管理員&#xff1a;登錄&#xff0c;個人中心&#xff0c;部門管理&#xff0c;員工管理&#xff0c;培訓信息管理&#xff0c;員工獎勵管理&#xff0c;員工懲罰管理員工考核管理&#xff0c;調薪信息管理&#xff0c;員工調動管理&#xff0c;員工工資管理員工&#xff1a;注…

金字塔降低采樣

文章目錄image_scale.hppimage_scale.cppmainimage_scale.hpp #ifndef IMAGE_SCALE_HPP #define IMAGE_SCALE_HPP#include <vector> #include <cstdint> #include <utility> // for std::pair #include <algorithm> #include <string> enum cl…

Filament引擎(四)——光照渲染Froxelizer實現分析

Froxelizer主要是用于filament光照效果的實現&#xff0c;生成光照渲染時所需的必要信息&#xff0c;幫助渲染過程中明確哪些區域受哪些光源所影響&#xff0c;是Filament中保證光照效果渲染效率的核心所在。這部分的源碼&#xff0c;可以結合filament官方文檔中Light Path部分…

2025 環法對決,VELO Angel Glide 坐墊輕裝上陣

2025環法第16賽段的風禿山之巔&#xff0c;當最后一縷夕陽沉入云層&#xff0c;山風裹挾著礫石的氣息掠過賽道&#xff0c;一場足以載入史冊的激戰正酣。帕雷-潘特的肌肉在汗水里賁張&#xff0c;鏈條與齒輪的咬合聲混著粗重喘息&#xff0c;在171.5公里賽程的最后3公里陡坡上&…

Linux程序->進度條

進度條最終效果&#xff1a; 目錄 進度條最終效果&#xff1a; 一&#xff1a;兩個須知 1&#xff1a;緩沖區 ①&#xff1a;C語言自帶緩沖區 ②&#xff1a;緩沖區的刷新策略 2&#xff1a;回車和換行的區別 二&#xff1a;倒計時程序 三&#xff1a;入門板進度條的實…

Python爬蟲實戰:研究tldextract庫相關技術構建新聞網站域名分析爬蟲系統

1. 引言 網絡爬蟲作為一種自動獲取互聯網信息的技術,在數據挖掘、信息檢索、輿情分析等領域有著廣泛的應用。Python 因其豐富的庫和簡潔的語法,成為了開發爬蟲的首選語言。tldextract 是 Python 中一個強大的域名解析庫,能夠準確地從 URL 中提取頂級域名、二級域名等關鍵信…

【算法-華為機試-火星基地改造】

基地改造題目描述目標輸入輸出代碼實現題目描述 在2XXX年&#xff0c;人們發現了一塊火星地區&#xff0c;這里看起來很適合建設新家園。但問題是&#xff0c;我們不能一次性將這片地區的空氣變得適合人類居住&#xff0c;得分步驟來。 把這片火星地區想象成一個巨大的棋盤。棋…