FEATURED · 精选文章

零基础入门python30:Flask个人账本从空目录运行与阶段验收

发布时间 / 2026/8/28 17:42:07
来源 / 创域科博编辑部
栏目 / 资讯中心
零基础入门python30:Flask个人账本从空目录运行与阶段验收 零基础入门python30Flask个人账本从空目录运行与阶段验收一、上一篇课后练习讲解报表测试应准备收入和支出两种记录断言income、expense、balance三个字段无效月份请求应返回 400不能被当成当前月份处理。上一篇课后练习完整答案上一篇练习的要求已落实到下面完整文件先运行项目测试再用 curl 对照状态码和数据库持久化结果答案要点pytest 用户故事从注册、登录走到分类、账目和报表并覆盖重复邮箱、越权和事务回滚失败路径。文件tests/test_flow.py完整参考答案文件完整文件tests/test_flow.pydeftest_duplicate_and_isolation(client):assertclient.post(/api/auth/register,json{email:ae.com,password:correct-horse}).status_code201assertclient.post(/api/auth/register,json{email:ae.com,password:correct-horse}).status_code409assertclient.get(/api/entries).status_code401完整参考答案文件本篇对应的交付源码完整文件flask-ledger/tests/test_app.pydeftest_health(client):assertclient.get(/api/health).get_json(){status:ok}deftest_register_login_and_me(client):responseclient.post(/api/auth/register,json{email:Aexample.com,password:password123})assertresponse.status_code201assertclient.post(/api/auth/login,json{email:aexample.com,password:password123}).status_code200assertclient.get(/api/auth/me).get_json()[email]aexample.comdeftest_ledger_flow(logged_client):categorylogged_client.post(/api/categories,json{name:餐饮}).get_json()createdlogged_client.post(/api/transactions,json{kind:expense,amount:28.50,category_id:category[id],happened_on:2026-08-06,note:午饭,})assertcreated.status_code201assertcreated.get_json()[amount]28.50itemslogged_client.get(/api/transactions).get_json()[items]assertlen(items)1statslogged_client.get(/api/statistics/monthly?month2026-08).get_json()assertstats[expense]28.50assertlogged_client.delete(f/api/transactions/{items[0][id]}).status_code204deftest_users_cannot_share_categories(client):client.post(/api/auth/register,json{email:firstexample.com,password:password123})client.post(/api/auth/login,json{email:firstexample.com,password:password123})categoryclient.post(/api/categories,json{name:工资}).get_json()client.post(/api/auth/logout)client.post(/api/auth/register,json{email:secondexample.com,password:password123})client.post(/api/auth/login,json{email:secondexample.com,password:password123})responseclient.post(/api/transactions,json{kind:income,amount:100,category_id:category[id]})assertresponse.status_code404验收命令python -m pytest -qDjango 项目使用 python manage.py test。预期测试通过若失败先检查迁移、配置和事务回滚。二、最终项目结构flask-ledger/ ├─ app/ │ ├─ __init__.py # 应用工厂 │ ├─ extensions.py # db/login扩展 │ ├─ models.py # User/Category/Transaction │ ├─ auth.py # 注册、登录、退出 │ └─ ledger.py # 分类、账目、报表 ├─ tests/ ├─ requirements.txt └─ run.py三、从空目录启动python-m venv.venv.venv\\Scripts\\activate pip install-r requirements.txt$env:SECRET_KEYchange-this-in-productionpython run.py生产环境不能使用开发密钥数据库地址、端口和日志级别也应通过环境变量提供。启动后依次验证/health、注册、登录、分类、账目、报表和删除。四、最终验收python-m pytest-q验收标准测试全部通过用户只能访问自己的资源金额使用 Decimal无效输入有明确状态码项目能够从空目录安装和启动。Flask 阶段完成后下一篇进入 Django 商城继续学习相同的模型、权限和事务思想在另一框架中的实现。五、毕业练习给 README 增加 API 表格包括方法、路径、登录要求、请求 JSON、成功状态码和失败状态码并用 curl 完成一次完整演示。项目增量从空目录完成 Flask 交付验收顺序是创建虚拟环境、安装依赖、复制环境变量、执行迁移、运行测试、启动服务和手工请求。任何一步失败都记录命令和原因不用“我本地可以”代替。python-m venv.venv.venv\\Scripts\\python.exe-m pip install-r requirements.txt.venv\\Scripts\\python.exe-m pytest-q.venv\\Scripts\\python.exe-m flask--app app run最终检查健康接口、注册登录、用户隔离、金额 Decimal、分页和月度报表README 写清数据库初始化和测试边界。课后练习提交一份故障复盘下一阶段把同样的项目思路迁移到 Django。六、Flask 阶段交付检查表交付前逐项执行删除ledger.db后运行迁移新建用户并验证密码列是哈希登录后创建分类和账目使用第二个用户请求第一个用户的 id确认返回 404插入收入和支出后核对报表执行python -m pytest -q并保存原始输出。若任一项只能在“已有数据的机器”上成功说明 README 或迁移仍不完整。项目的价值不在接口数量而在边界清楚配置不进代码密码不进日志金额不使用浮点查询默认带所有权失败事务可回滚。带着这五条原则进入 Django看到相似需求时就能判断哪些代码可以复用、哪些必须重新设计。再做一次“破坏性验收”把数据库文件改成只读/ready应返回明确的 503把环境变量SECRET_KEY删除生产配置应拒绝启动把一个账目的user_id改成另一个用户列表和报表都不能显示它。把这些失败结果写入 README后来的读者才能知道项目不仅能跑通成功路径也能在依赖异常时安全失败。最后检查文档中的每个命令都在项目根目录可执行路径使用正斜杠或 PowerShell 兼容写法代码示例的文件名与仓库一致。验收者不需要猜“这段代码放哪里”也不需要依赖作者机器上的隐藏环境变量。若使用外部 PostgreSQL只需替换DATABASE_URL并重新执行迁移接口和测试不应改变这正是应用工厂和 Repository 边界带来的可替换性。把验收记录连同版本号提交后续回顾时可以复现同一次结果。这份报告就是本阶段的交付凭证。七、阶段性项目复盘Flask 账本从/health开始逐步串起配置、蓝图、认证、分类、账目、分页、报表和 pytest。每个接口都有明确的输入、成功状态码和失败状态码每个数据查询都带当前用户每个跨多表写入都说明事务边界。学习者可以从app/__init__.py沿着蓝图追到 service再从测试反向理解需求而不是只能复制一个大文件。建议把验收数据写入docs/flask-acceptance.md记录命令、时间、Python 版本、数据库迁移版本和失败场景。下一阶段 Django 会用同样的验收表格但把事务和权限放到 Django 的 service、QuerySet 和 DRF 层中。验收报告示例环境Windows 11 / Python 3.11.9 / Flask 3.x 迁移head2025_01_add_entry_constraints 测试5 passed 冒烟health200, register201, duplicate409, login200, category201, entry201, report200, cross_user404 故障只读数据库时 ready503恢复写权限后重新迁移并通过测试报告中的数字必须来自实际终端而不是手工填写。若以后增加字段或更换数据库先更新验收脚本再修改文档正文确保学习者总能按同一组命令验证结果。Flask 阶段到此形成可交付的个人账本而不是若干互不相干的示例接口。本篇结束完整模块文件下面是交付项目中真实存在的完整文件 flask-ledger/tests/test_app.py。它覆盖本篇新增逻辑以及前文已经完成的依赖代码复制单个函数会丢失上下文因此这里提供整份文件。deftest_health(client):assertclient.get(/api/health).get_json(){status:ok}deftest_register_login_and_me(client):responseclient.post(/api/auth/register,json{email:Aexample.com,password:password123})assertresponse.status_code201assertclient.post(/api/auth/login,json{email:aexample.com,password:password123}).status_code200assertclient.get(/api/auth/me).get_json()[email]aexample.comdeftest_ledger_flow(logged_client):categorylogged_client.post(/api/categories,json{name:餐饮}).get_json()createdlogged_client.post(/api/transactions,json{kind:expense,amount:28.50,category_id:category[id],happened_on:2026-08-06,note:午饭,})assertcreated.status_code201assertcreated.get_json()[amount]28.50itemslogged_client.get(/api/transactions).get_json()[items]assertlen(items)1statslogged_client.get(/api/statistics/monthly?month2026-08).get_json()assertstats[expense]28.50assertlogged_client.delete(f/api/transactions/{items[0][id]}).status_code204deftest_users_cannot_share_categories(client):client.post(/api/auth/register,json{email:firstexample.com,password:password123})client.post(/api/auth/login,json{email:firstexample.com,password:password123})categoryclient.post(/api/categories,json{name:工资}).get_json()client.post(/api/auth/logout)client.post(/api/auth/register,json{email:secondexample.com,password:password123})client.post(/api/auth/login,json{email:secondexample.com,password:password123})responseclient.post(/api/transactions,json{kind:income,amount:100,category_id:category[id]})assertresponse.status_code404
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻