尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI辅助开发实战:用Flask和SQLite从零搭建待办清单系统

AI辅助开发实战:用Flask和SQLite从零搭建待办清单系统 纯小白第一次接触用 AI 做系统最常见的心态是把需求往对话框里一贴AI 把代码吐出来复制到本地保存运行系统就成了。真正做过一次就会知道这个流程少了两个关键环节一是你不清楚应该让 AI 生成什么二是代码生成之后你还没有能力把文件、环境、数据库和运行方式串起来。这篇文章就用一个待办清单管理系统为例把从需求到运行的完整链路拆开告诉你怎么用大白话和 AI 对话怎么判断它生成的内容遇到报错又该怎么回喂给它。目标不是让某一种语言变成你的强项而是建立一条可复用的 AI 辅助开发路径。1. 先理解 AI 写系统的逻辑它给你的是素材不是成品很多教程喜欢说“让 AI 帮你写系统”但“写系统”这件事本身是模糊的。系统不是一段代码也不是一个文件而是一组文件、依赖、数据和行为规则最终组合成一个能通过浏览器访问、能保存数据、能处理用户操作的服务。1.1 为什么“一句话生成系统”在小项目里并不是天方夜谭大语言模型的训练数据里包含大量代码仓库、技术文档、问答和开源项目所以对于常见的增删改查类系统模型确实能生成非常接近可用的代码。待办清单、博客、笔记、留言板、库存管理等都属于这类模式。问题在于模型生成的是“代码片段”不是“文件夹”。同一个系统AI 可能只给你一个app.py但实际运行还需要模板文件、依赖清单、初始化表结构、启动命令。如果只复制主文件第一次运行大概率会报错。1.2 一套可用系统等于代码 环境 数据 运行路径把 AI 生成的代码当成素材再手动补全其他部分问题就清晰多了。一个最小可运行的系统至少包含四块内容组成部分说明小白容易忽略的地方代码主程序、页面模板、样式文件只复制一个文件缺少目录结构环境Python、依赖包、虚拟环境不装依赖启动直接报No module named数据数据库文件、表结构第一次访问没初始化表报No such table运行路径启动命令、访问地址、端口不知道在哪里打开浏览器确认效果后面所有步骤都围绕这四块展开。理解了这一点就不会再指望 AI 一次性给你一个“成品系统”而是学会和 AI 一起把一个空目录变成可运行项目。2. 从最小目标开始把“待办清单系统”拆成 AI 能理解的需求AI 编程最怕的不是需求复杂而是需求没说清楚。你丢一句“帮我做一个系统”它只能猜。你丢一组“需求、技术栈、页面行为、运行要求”它才能生成接近可用的代码。2.1 为什么选择“待办清单”作为入门项目待办清单包含一个系统最常见的完整闭环数据建模、新增、读取、修改、删除。它没有复杂的业务规则也没有支付、权限、弹窗流很适合第一次体验“从 0 到 1”。用 AI 做这个项目时你可以把注意力放在方法论上而不是被业务逻辑带偏。后面换成记账本、读书笔记流程完全一样。2.2 用大白话给 AI 写第一版任务描述推荐的提示词结构是说明身份、指定技术栈、列出功能、说明页面形式、要求输出文件结构和运行命令。我是一个没写过代码的新手。请帮我用 Python Flask 做一个待办清单系统。 功能要求 1. 能新增待办事项。 2. 能标记为已完成也能取消完成。 3. 能删除待办事项。 4. 使用 SQLite 保存数据数据库文件放在项目目录下。 页面要求 1. 只有一个页面展示所有待办。 2. 页面顶部是输入框和“新增”按钮。 3. 每一条待办后面有“完成”和“删除”按钮。 4. 已完成的待办文字显示删除线。 文件结构要求 1. 请把主程序放在 app.py页面模板放在 templates/index.html。 2. 提供 requirements.txt。 3. 提供 Windows 下的启动命令。为什么这样写因为每一句话都在限制 AI 的发挥空间。指定Flask是限制技术栈指定SQLite是限制数据存储方式指定templates/index.html是限制文件结构指定Windows是让命令更匹配当前环境。2.3 AI 会返回什么先学会读结果AI 大概率会给你一个app.py、一个index.html、一个requirements.txt同时附上运行说明。这套结果已经接近可用。但不要直接信任。重点检查三处有没有初始化数据库表的逻辑。模板文件里的表单路径和主程序路由是否一致。依赖是否被完整写进requirements.txt。如果发现它把模板直接写在app.py里也没关系后续可以再问一句“请把页面模板拆到 templates/index.html”。3. 让 AI 生成代码然后用本地环境把它跑起来纯小白最容易卡在“代码有了项目跑不起来”。这不是笨而是环境没有对齐。3.1 环境准备Python、编辑器和虚拟环境先确认电脑上有没有 Python。Windows 下打开 PowerShell输入python --version如果提示找不到命令可以再试py --version推荐环境如下工具版本建议说明Python3.10 以上Flask 和 sqlite3 都能兼容Flask3.x 系列安装时用 pip不需要手动下载数据库SQLitePython 内置 sqlite3不需要额外安装编辑器VS Code 或任意文本编辑器方便查看文件结构建议使用虚拟环境避免依赖被装进全局 Python。Windows 下创建和激活虚拟环境的命令python -m venv venv venv\Scripts\activate如果 PowerShell 提示“因为在此系统上禁止运行脚本”不是项目出错。执行下面命令只修改当前用户策略然后重新激活Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser如果以后运行 npm 命令也遇到类似提示通常是同一类 PowerShell 执行策略问题可以先检查当前策略再决定是否需要放开。3.2 先让 AI 输出文件结构再创建项目目录项目目录最好提前创建好。可以按这样的结构准备todo-system/ app.py requirements.txt templates/ index.html不要把所有文件都放在一个深层次桌面路径里。路径带中文、空格太多有时会让新手分不清当前终端在哪一层。3.3 生成主程序 app.py把下面内容保存为app.py。这段代码由 AI 生成后经过整理变成了最小可用版本。from flask import Flask, request, redirect, url_for, render_template import sqlite3 from datetime import datetime app Flask(__name__) DATABASE todos.db def get_db(): conn sqlite3.connect(DATABASE) conn.row_factory sqlite3.Row return conn def init_db(): with get_db() as db: db.execute( CREATE TABLE IF NOT EXISTS todos ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, done INTEGER DEFAULT 0, created_at TEXT NOT NULL ) ) app.route(/) def index(): db get_db() todos db.execute(SELECT * FROM todos ORDER BY created_at DESC).fetchall() db.close() return render_template(index.html, todostodos) app.route(/add, methods[POST]) def add(): title request.form.get(title, ).strip() if title: with get_db() as db: db.execute( INSERT INTO todos (title, created_at) VALUES (?, ?), (title, datetime.now().strftime(%Y-%m-%d %H:%M:%S)) ) return redirect(url_for(index)) app.route(/toggle/int:todo_id) def toggle(todo_id): with get_db() as db: db.execute( UPDATE todos SET done 1 - done WHERE id ?, (todo_id,) ) return redirect(url_for(index)) app.route(/delete/int:todo_id) def delete(todo_id): with get_db() as db: db.execute(DELETE FROM todos WHERE id ?, (todo_id,)) return redirect(url_for(index)) if __name__ __main__: init_db() app.run(debugTrue)关键点有两个。一是init_db()一定要在app.run()前执行否则第一次访问页面时数据库里根本没有todos表会直接报sqlite3.OperationalError: no such table: todos。二是所有 SQL 操作都用了?占位符而不是把title直接拼进 SQL 字符串。这是安全的做法能避免 SQL 注入风险。3.4 生成页面模板 templates/index.html在templates目录下新建index.html写入!DOCTYPE html html langzh head meta charsetUTF-8 title我的待办清单/title style body { font-family: sans-serif; max-width: 600px; margin: 40px auto; } .done { text-decoration: line-through; color: gray; } /style /head body h1我的待办清单/h1 form action/add methodpost input typetext nametitle placeholder输入新待办 required button typesubmit新增/button /form ul {% for todo in todos %} li class{{ done if todo.done else }} a href/toggle/{{ todo.id }} {{ 取消完成 if todo.done else 完成 }} /a span{{ todo.title }}/span a href/delete/{{ todo.id }}删除/a /li {% else %} li还没有待办先加一条吧。/li {% endfor %} /ul /body /html这里用到了 Flask 自带的 Jinja2 模板语法。{% for todo in todos %}是在循环渲染列表{{ todo.title }}是输出当前待办的标题。模板文件必须放在templates目录里目录名不能写错否则 Flask 会报TemplateNotFound。4. 运行、验证和把报错回喂给 AI代码文件写好后进入第一次运行。这一步要有心理准备不报错是幸运报错是常态。重点不是追求一次成功而是学会从错误里找到信息。4.1 第一次启动从终端到浏览器在项目目录下创建依赖清单requirements.txtflask然后依次执行pip install -r requirements.txt python app.py如果python不行试py app.py。正常启动后终端会输出类似Running on http://127.0.0.1:5000。打开浏览器访问http://127.0.0.1:5000就能看到待办清单页面。如果看到端口被占用说明 5000 端口已经被其他程序使用。可以把启动命令改成python app.py --port 5001更简单的方式是在代码最后改成app.run(debugTrue, port5001)4.2 功能验证清单别只验证“能打开”很多新手看到页面打开就认为系统完成了。真正要验证的是操作链路。按下面表格逐项点一遍功能操作预期结果新增待办输入内容点击新增页面刷新后列表出现新待办标记完成点击“完成”文字出现删除线颜色变灰取消完成点击“取消完成”删除线消失颜色恢复正常删除待办点击“删除”该条记录从列表消失数据持久化关闭终端重新python app.py之前加的待办还在如果最后一条不通过说明数据库没有真正持久化可能是代码连接了内存数据库或者数据库文件路径不对。4.3 报错了不要重新生成把错误信息喂给 AI代码运行出问题时最错误的做法是清空对话重新让 AI 生成一遍。这样做会丢失上下文AI 又会给你一份看似全新但同问题的代码。正确做法是把错误信息、执行过的命令、项目结构一起丢给 AI我运行 python app.py 后出现这段报错 [在这里粘贴完整报错不要只粘贴最后一行] 我的环境是 Windows 10Python 3.11已经执行过 pip install -r requirements.txt。 项目目录结构如下 todo-system/ app.py requirements.txt templates/ index.html 请帮我解释原因并给出修改后的最小代码片段。为什么要给完整报错因为很多新手只复制最后一行No such table: todosAI 看不出是没建表还是建表失败。给完整 Traceback 和项目结构后AI 才能定位问题在哪一层。5. 常见坑AI 写系统最容易翻车的地方用 AI 做系统翻车点往往不是 AI 能力不够而是使用方式不对。下面几个坑几乎每个人都会遇到。5.1 坑一把 AI 输出的代码当成整个项目AI 给你一个app.py你就只建一个文件。运行时报TemplateNotFound因为你还没建templates目录也没写index.html。解决方案是在提示词里明确要求“按文件结构输出”并且在本地创建对应的目录。代码只是项目的一部分文件位置、依赖清单、数据库初始化都是项目成员。5.2 坑二提示词太宽泛AI 反复猜需求“帮我做一个系统”这类提示词AI 只能靠猜。猜偏了你让它改它改完可能又偏了。更高效的方式是先花两分钟把需求拆成列表。页面有哪些按钮数据保存到哪里用哪个框架启动命令是什么这些信息越具体生成结果的可用性越高。这不是你不会表达而是你要学会把一个模糊目标变成可执行任务。5.3 坑三遇到报错就清空对话重新生成重新生成会带来新的问题。比如数据库初始化代码和旧版本不一致导致老数据读不出来或者模板语法变了页面样式全乱。推荐做法是保留对话上下文直接在后面追加提问。AI 能记录前面的代码减少重复解释成本。只有当前对话已经彻底混乱或者你换了一个完全不同的技术方案才值得开新对话。5.4 坑四不检查文件路径和启动目录很多报错看起来是代码问题其实是路径问题。例如你在C:\Users\你\Desktop\todo-system下执行python app.py但代码里读取的是相对路径todos.db那么这个数据库文件就会生成在当前目录。如果没先切换目录就直接运行项目找不到模板数据库也不知道建在哪里。检查方式很简单。启动前先确认终端当前路径在项目根目录再执行命令。Windows 下可以这样查看pwd如果路径不对用cd切换到项目目录再执行启动命令。6. 从“能跑”到“可用”生产环境还要补什么文章到这里项目已经在本地跑通了。但“本地能跑”和“生产环境可用”之间还有距离。用 AI 做系统时不要满足于能打开页面还要知道一套可用系统在生产环境还需要补哪些东西。6.1 功能层面至少还要补四件事学习环境里代码可以只考虑正常路径。生产环境必须考虑异常和资源限制。一是输入校验。现在新增待办时只做了空字符串判断生产环境还要限制长度、过滤危险内容、防止重复提交。二是异常处理。数据库写入失败、磁盘空间不足、用户频繁点击都需要有兜底逻辑而不是直接抛出一个带技术细节的错误页。三是日志。至少记录启动时间、每次新增或删除操作的时间、关键报错的堆栈。以后排查问题才不会靠回忆。四是权限。单用户待办系统不需要登录但一旦多人使用就必须区分用户身份。AI 能帮你生成登录页面但你要理解登录背后的会话、密码存储和权限控制。6.2 部署层面还要注意这些差距Flask 自带的app.run(debugTrue)只适合开发调试。生产环境不能直接这样跑因为性能差而且debugTrue会暴露详细报错信息安全风险很高。常见做法是使用waitress或gunicorn这样更稳定的 WSGI 服务器再加一层反向代理处理静态资源和请求转发。同时需要配置环境变量把数据库路径、密钥等敏感信息外置不能写死在代码里。对于刚开始练习的人可以先不考虑完整部署。但至少要知道生产环境还需要进程守护、日志切割、数据库备份和回滚方案。6.3 给小白的三条进阶练习建议第一把待办清单改成“带登录功能的个人笔记系统”。这一步会让你理解用户体系和权限控制。第二让 AI 帮你生成测试用例。不要只让 AI 写功能代码还可以让它根据当前代码生成pytest测试然后人工验证这些测试是否合理。第三把项目提交到git仓库每次改动前先确认代码能运行再提交新版本。这样 AI 改坏时至少还能回到上一个可用状态。真正有价值的能力不是背下 Flask 语法也不是记住 SQLite 命令而是能判断 AI 给出的代码离“可用”还差多少知道下一步该问什么知道报错从哪里开始查。这条能力一旦建立后面做成任何系统都会快很多。
返回列表