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 程序。
网友回复
js如何流式输出ai的回答并折叠代码块,点击代码块右侧可预览代码?
ai大模型如何将文章转换成可视化一目了然的图片流程图图表?
大模型生成html版本的ui原型图和ppt演示文档的系统提示词怎么写?
rtsp视频直播流如何转换成websocket流在h5页面上观看?
为啥coze会开源工作流agent coze studio?
如何检测网页是通过收藏夹打开的?
python如何实现类似php的http动态脚本请求处理响应代码?
js如何实现类似php的http动态脚本请求处理响应代码?
trae与solo有啥区别不同?
vue如何让ai动态生成问卷调查多步骤表单式收集基础信息自动规划执行任务?