htmy 是一个异步的纯 Python 渲染引擎,它可以帮助你创建复杂的网页应用。以下是如何使用 htmy 编写一个 SQLite 的 CRUD(增删改查)Web 程序的步骤。
1. 安装 htmy 和其他依赖项首先,你需要安装 htmy 和 FastAPI,因为 htmy 与 FastAPI 有很好的集成。你可以通过以下命令安装这些依赖项:
pip install htmy fastapi uvicorn2. 创建数据库和表
创建一个 Python 脚本,用于初始化 SQLite 数据库和创建表。例如,创建一个名为 app.py 的文件,并在其中编写以下代码:
import sqlite3 def init_db(): conn = sqlite3.connect('mydatabase.db') c = conn.cursor() c.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, name TEXT NOT NULL, email TEXT NOT NULL ) ''') conn.commit() conn.close() init_db()3. 创建 htmy 组件
使用 htmy 创建组件来显示和操作数据。例如,创建一个用户列表组件:
from dataclasses import dataclass from htmy import Component, Context, component, html @dataclass(frozen=True, kw_only=True, slots=True) class User: id: int username: str name: str email: str @component def user_row(user: User, context: Context) -> Component: return html.tr( html.td(user.id), html.td(user.username), html.td(user.name), html.td(html.a(user.email, href=f"mailto:{user.email}")), html.td(html.a("Edit", href=f"/edit/{user.id}")), html.td(html.a("Delete", href=f"/delete/{user.id}", hx_delete="/delete/{user.id}", hx_trigger="click", hx_swap="outerHTML")) ) @component def user_table(users: list[User], context: Context) -> Component: return html.table( html.thead( html.tr( html.th("ID"), html.th("Username"), html.th("Name"), html.th("Email"), html.th("Actions") ) ), html.tbody([user_row(user) for user in users]) )4. 创建 FastAPI 应用
创建一个 FastAPI 应用,并使用 htmy 的 HTMY 实例来渲染组件。例如:
from fastapi import FastAPI, Request from fasthx.htmy import HTMY from htmy import html app = FastAPI() htmy = HTMY() @app.get("/") @htmy.page(lambda _: IndexPage()) def index() -> None: """The index page of the application.""" ... @app.get("/users") @htmy.page(lambda users: user_table(users)) def get_users() -> list[User]: conn = sqlite3.connect('mydatabase.db') c = conn.cursor() c.execute("SELECT * FROM users") users = [User(id=row[0], username=row[1], name=row[2], email=row[3]) for row in c.fetchall()] conn.close() return users @app.post("/users") def create_user(user: User): conn = sqlite3.connect('mydatabase.db') c = conn.cursor() c.execute("INSERT INTO users (username, name, email) VALUES (?, ?, ?)", (user.username, user.name, user.email)) conn.commit() conn.close() return {"message": "User created"} @app.put("/users/{user_id}") def update_user(user_id: int, user: User): conn = sqlite3.connect('mydatabase.db') c = conn.cursor() c.execute("UPDATE users SET username=?, name=?, email=? WHERE id=?", (user.username, user.name, user.email, user_id)) conn.commit() conn.close() return {"message": "User updated"} @app.delete("/users/{user_id}") def delete_user(user_id: int): conn = sqlite3.connect('mydatabase.db') c = conn.cursor() c.execute("DELETE FROM users WHERE id=?", (user_id,)) conn.commit() conn.close() return {"message": "User deleted"}5. 运行应用
最后,运行你的 FastAPI 应用:
uvicorn app:app --reload总结
通过以上步骤,你使用 htmy 和 FastAPI 创建了一个简单的 SQLite CRUD 增删改查 Web 程序。
网友回复