+
98
-

回答

htmy 是一个异步的纯 Python 渲染引擎,它可以帮助你创建复杂的网页应用。以下是如何使用 htmy 编写一个 SQLite 的 CRUD(增删改查)Web 程序的步骤。

1. 安装 htmy 和其他依赖项

首先,你需要安装 htmy 和 FastAPI,因为 htmy 与 FastAPI 有很好的集成。你可以通过以下命令安装这些依赖项:

pip install htmy fastapi uvicorn
2. 创建数据库和表

创建一个 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 程序。

网友回复

我知道答案,我要回答