零基础入门python44:Django商城从空目录启动与最终验收
零基础入门python44Django商城从空目录启动与最终验收一、上一篇课后练习讲解库存边界测试应覆盖库存为 0、购买数量为 0、数量超过库存和正常购买四种情况每种情况都要断言状态码和数据库库存不能只看响应文本。上一篇课后练习完整答案上一篇练习的要求已落实到下面完整文件先运行项目测试再用 curl 对照状态码和数据库持久化结果答案要点接口测试检查状态码、响应头和数据库快照库存不足、重复下单、并发锁和事务异常都有明确断言。文件shop/tests.py完整参考答案文件完整文件shop/tests.pyfromdjango.testimportTestCasefrom.modelsimportOrderclassStockTests(TestCase):deftest_insufficient_stock_rolls_back(self):responseself.client.post(/api/orders/,{items:[]},content_typeapplication/json)self.assertEqual(response.status_code,409)self.assertEqual(Order.objects.count(),0)完整参考答案文件本篇对应的交付源码完整文件django-shop/shop/tests.pyfromdjango.contrib.authimportget_user_modelfromrest_framework.testimportAPITestCasefrom.modelsimportCategory,Order,ProductclassShopApiTest(APITestCase):defsetUp(self):self.userget_user_model().objects.create_user(usernamealice,passwordpassword123)categoryCategory.objects.create(name图书,slugbooks)self.productProduct.objects.create(categorycategory,namePython入门,slugpython,price59.00,stock5)deftest_products_are_public(self):responseself.client.get(/api/products/)self.assertEqual(response.status_code,200)self.assertEqual(response.data[0][name],Python入门)deftest_checkout_requires_login(self):responseself.client.post(/api/checkout/,{items:[{product_id:self.product.id,quantity:1}]},formatjson)self.assertEqual(response.status_code,403)deftest_session_cart_checks_stock(self):responseself.client.post(/api/cart/,{product_id:self.product.id,quantity:2},formatjson)self.assertEqual(response.status_code,201)self.assertEqual(response.data[str(self.product.id)],2)responseself.client.post(/api/cart/,{product_id:self.product.id,quantity:9},formatjson)self.assertEqual(response.status_code,400)deftest_checkout_creates_order_and_reduces_stock(self):self.client.force_authenticate(self.user)responseself.client.post(/api/checkout/,{items:[{product_id:self.product.id,quantity:2}]},formatjson)self.assertEqual(response.status_code,201)self.assertEqual(response.data[total_amount],118.00)self.product.refresh_from_db()self.assertEqual(self.product.stock,3)self.assertEqual(Order.objects.get().user,self.user)deftest_insufficient_stock_rolls_back_order(self):self.client.force_authenticate(self.user)responseself.client.post(/api/checkout/,{items:[{product_id:self.product.id,quantity:9}]},formatjson)self.assertEqual(response.status_code,400)self.assertEqual(Order.objects.count(),0)验收命令python -m pytest -qDjango 项目使用 python manage.py test。预期测试通过若失败先检查迁移、配置和事务回滚。二、最终项目结构django-shop/ ├─ manage.py ├─ config/ │ ├─ settings.py │ └─ urls.py └─ shop/ ├─ models.py ├─ serializers.py ├─ views.py ├─ services.py ├─ admin.py ├─ urls.py ├─ migrations/ └─ tests.py三、从空目录运行python-m venv.venv.venv\\Scripts\\activate pip install-r requirements.txt python manage.py migrate python manage.py createsuperuser python manage.py runserver访问/admin/创建分类和商品再用 API 完成浏览、加入购物车、登录结算和订单查询。生产环境使用 MySQL 时必须先配置DATABASES、utf8mb4 和专用数据库账号再执行完整迁移和测试。四、毕业验收清单未登录可以浏览上架商品但不能结算用户只能查看自己的订单库存不足不会创建半条订单商品价格修改不影响历史订单快照Admin 可以运营商品但不能绕过业务审计修改订单事实python manage.py test全部通过python manage.py check无问题。Django 商城阶段至此形成独立可运行项目。下一篇进入 FastAPI 博客从 ASGI、Pydantic 和依赖注入开始实现另一套后端架构。五、毕业练习为商城写一份 API README列出认证方式、请求体、状态码和错误示例并录制一次从创建商品到成功下单的终端演示。项目增量从空目录验收 Django 商城python-m venv.venv.venv\\Scripts\\python.exe-m pip install-r requirements.txt.venv\\Scripts\\python.exe manage.py migrate.venv\\Scripts\\python.exe manage.py test-v 0.venv\\Scripts\\python.exe manage.py runserver验收 Admin 商品维护、登录、购物车、下单、库存锁、DRF 商品列表和订单权限保存测试输出与关键 curl 响应。数据库迁移文件、环境变量和 seed 数据必须能从空目录复现。课后练习把商城 README 改成新同学可执行的清单包含初始化、测试、接口示例、失败场景和清理命令下一阶段进入 FastAPI 博客项目。五、上一篇练习讲解从并发测试回到可复现命令并发库存测试必须在 PostgreSQL 上跑SQLite 只用于快速单元测试。README 应明确依赖Python 3.11、Django 5、DRF、PostgreSQL 16以及迁移顺序。不要把“本机已有 db.sqlite3”当作交付物验收从空目录重新建库。六、从空目录执行的完整清单py-3.11-m venv.venv.venv\Scripts\Activate.ps1 python-m pip install--upgrade pip python-m pip install-r requirements.txtcopy.env.example.env python manage.py check python manage.py migrate--plan python manage.py migrate python manage.py createsuperuser python manage.py test-v 2 python manage.py runserver 127.0.0.1:8000.env只保存数据库地址和密钥不提交 GitCI 使用临时 PostgreSQL 服务。若 PowerShell 禁止激活可直接使用.venv\Scripts\python.exe -m pip ...这比修改全局执行策略更安全。七、毕业演示脚本Admin 创建分类和商品设置库存 5。注册普通用户并登录调用商品列表确认只能看到is_activeTrue。把商品加入购物车发送带幂等键的下单请求得到 201重复发送同 key 得到 200 且订单 id 相同。再次下单超过库存得到 409查询数据库确认库存仍为 0、没有新增订单。用户 B 查询用户 A 的订单得到 404staff 使用发货接口将 paid 订单改为 shipped。终端记录应包含请求、状态码和关键响应字段但要打码 token、cookie、密码。验收报告同时附python manage.py test和python manage.py check的原始输出。八、项目分层复盘与常见故障config负责 settings/urlsshop.models描述数据Serializer 负责 JSON 边界View 负责 HTTPservices.py负责事务和库存tests 固定业务契约。出现 404 先看 URL 路由出现 403 看认证和权限出现 409 看库存/幂等状态出现 500 先查看服务端 traceback再定位迁移或序列化字段。九、Django 阶段毕业练习把 README 改成可打印的验收清单包含初始化、迁移、测试、接口示例、失败场景和清理命令为订单增加 CSV 导出仅限 staff并写权限测试。完成后进入 FastAPI 博客项目继续沿用“完整代码 设计解释 运行结果 排错 练习”的格式。Django 阶段的最终交付不是一个能打开 Admin 的空项目而是一条可演示业务链运营建商品用户登录并加入购物车订单快照保存价格事务锁住库存DRF 返回稳定 JSON权限测试阻止越权。将这条链录成终端脚本任何新环境都能重放才算完成验收。本篇结束完整模块文件下面是交付项目中真实存在的完整文件 django-shop/shop/tests.py。它覆盖本篇新增逻辑以及前文已经完成的依赖代码复制单个函数会丢失上下文因此这里提供整份文件。fromdjango.contrib.authimportget_user_modelfromrest_framework.testimportAPITestCasefrom.modelsimportCategory,Order,ProductclassShopApiTest(APITestCase):defsetUp(self):self.userget_user_model().objects.create_user(usernamealice,passwordpassword123)categoryCategory.objects.create(name图书,slugbooks)self.productProduct.objects.create(categorycategory,namePython入门,slugpython,price59.00,stock5)deftest_products_are_public(self):responseself.client.get(/api/products/)self.assertEqual(response.status_code,200)self.assertEqual(response.data[0][name],Python入门)deftest_checkout_requires_login(self):responseself.client.post(/api/checkout/,{items:[{product_id:self.product.id,quantity:1}]},formatjson)self.assertEqual(response.status_code,403)deftest_session_cart_checks_stock(self):responseself.client.post(/api/cart/,{product_id:self.product.id,quantity:2},formatjson)self.assertEqual(response.status_code,201)self.assertEqual(response.data[str(self.product.id)],2)responseself.client.post(/api/cart/,{product_id:self.product.id,quantity:9},formatjson)self.assertEqual(response.status_code,400)deftest_checkout_creates_order_and_reduces_stock(self):self.client.force_authenticate(self.user)responseself.client.post(/api/checkout/,{items:[{product_id:self.product.id,quantity:2}]},formatjson)self.assertEqual(response.status_code,201)self.assertEqual(response.data[total_amount],118.00)self.product.refresh_from_db()self.assertEqual(self.product.stock,3)self.assertEqual(Order.objects.get().user,self.user)deftest_insufficient_stock_rolls_back_order(self):self.client.force_authenticate(self.user)responseself.client.post(/api/checkout/,{items:[{product_id:self.product.id,quantity:9}]},formatjson)self.assertEqual(response.status_code,400)self.assertEqual(Order.objects.count(),0)

相关新闻

零基础入门python43:Django接口测试与库存边界

零基础入门python43:Django接口测试与库存边界

零基础入门python43:Django接口测试与库存边界一、上一篇课后练习讲解 管理员查看全部订单应使用独立的权限类和 ViewSet,不能修改普通用户的 get_queryset。权限越宽的接口越应该单独命名、单独测试。 上一篇课后练习完整答案 上一篇练习的要求已落实到…

2026/9/2 8:13:39 阅读更多 →
零基础入门python42:订单权限与用户数据隔离

零基础入门python42:订单权限与用户数据隔离

零基础入门python42:订单权限与用户数据隔离一、上一篇课后练习讲解 购物车只能在订单事务提交成功后清空;库存不足时应保留购物车,方便用户修改数量。清空动作可以在 Service 成功返回后执行。 上一篇课后练习完整答案 上一篇练习的要求已落…

2026/9/2 8:13:39 阅读更多 →
Dify:124万行代码的开源平台,让AI工作流从“画得出”变成“跑得稳”

Dify:124万行代码的开源平台,让AI工作流从“画得出”变成“跑得稳”

Dify:124万行代码的开源平台,让AI工作流从“画得出”变成“跑得稳”一句话先睹为快:Dify不是又一个大模型API聚合工具,而是一套以“Modular Monolith DDD”为骨架、以“自研DAG引擎队列化Worker Pool”为心脏、以“7容器400环境变…

2026/9/2 8:13:39 阅读更多 →

最新新闻

基于SpringBoot的老龄与托育备案管理平台毕业设计项目源码文档

基于SpringBoot的老龄与托育备案管理平台毕业设计项目源码文档

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/9/2 9:02:19 阅读更多 →
Origin2025b零基础入门:从数据导入到科学图表绘制的完整指南

Origin2025b零基础入门:从数据导入到科学图表绘制的完整指南

在实际科研数据处理和工程绘图领域,OriginLab 是一款功能强大的专业软件,尤其以其在数据分析和科学绘图方面的深度与精度著称。Origin2025b 作为其较新版本,引入了更多现代化的界面和功能,但对于初次接触的用户,其复杂…

2026/9/2 9:02:19 阅读更多 →
KingSCADA 3.7集成KIOSP2补丁:工业监控系统部署、配置与排障实战指南

KingSCADA 3.7集成KIOSP2补丁:工业监控系统部署、配置与排障实战指南

简介:本资源为KingSCADA 3.7工业监控系统完整安装与运行环境包,集成KIOSP2物联网操作系统平台,面向自动化工程师、SCADA系统运维人员及工业信息化项目实施技术人员,用于构建实时数据采集、远程设备控制、报警管理与历史趋势分析的…

2026/9/2 9:02:19 阅读更多 →
从模块到芯片:基于DRV8701的直流有刷电机高性能驱动设计实战

从模块到芯片:基于DRV8701的直流有刷电机高性能驱动设计实战

简介:本资源是面向智能车竞赛(如C车、F车)开发者的DRV8701电机驱动器实战资料包,聚焦电机驱动硬件设计与工程落地,解决初学者在H桥驱动选型、PCB布局、电流检测闭环及保护电路实现中的典型难题。压缩包共6个文件&#…

2026/9/2 9:02:19 阅读更多 →
从线性阅读到知识重构:构建可检索AI技能库的工程化拆书法

从线性阅读到知识重构:构建可检索AI技能库的工程化拆书法

你有没有过这样的经历:花了好几天,甚至几周时间读完一本技术书或专业著作,合上书的那一刻,感觉收获满满,但一周后,当你想引用某个具体概念或方法时,大脑却一片空白,只记得“我好像读…

2026/9/2 9:02:19 阅读更多 →
电视直播软件怎么选?my-tv 开源应用三步装好、零配置上手完整指南

电视直播软件怎么选?my-tv 开源应用三步装好、零配置上手完整指南

电视直播软件怎么选?my-tv 开源应用三步装好、零配置上手完整指南 【免费下载链接】my-tv 我的电视 电视直播软件,安装即可使用 项目地址: https://gitcode.com/GitHub_Trending/my/my-tv 找不到一款靠谱又省事的电视直播软件?不少应用…

2026/9/2 9:01:19 阅读更多 →

日新闻

QEMU为什么能模拟不同CPU?从ISA、CPU模型到指令翻译讲起

QEMU为什么能模拟不同CPU?从ISA、CPU模型到指令翻译讲起

1. 引言:一个软件为何能“伪装”成不同CPUQEMU 是一款广为人知的开源模拟器,它既能在一台 x86 电脑上运行 ARM 系统,也能在 ARM 开发板上启动 x86 的 Linux 发行版。很多人第一次接触 QEMU 时都会好奇:一个纯软件程序,…

2026/9/2 0:00:30 阅读更多 →
单片机计算机毕设之基于 STM32 或 51 单片机的感知式智能垃圾桶硬件控制系统设计 基于 STM32 或 51 单片机的安全防护型智能垃圾桶装置设计(025005)

单片机计算机毕设之基于 STM32 或 51 单片机的感知式智能垃圾桶硬件控制系统设计 基于 STM32 或 51 单片机的安全防护型智能垃圾桶装置设计(025005)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/2 0:00:30 阅读更多 →
单片机计算机毕设之基于 ESP8266 的智能垃圾分类桶 APP 监控系统设计与实现 基于单片机的超声波满溢检测垃圾分类装置设计(025105)

单片机计算机毕设之基于 ESP8266 的智能垃圾分类桶 APP 监控系统设计与实现 基于单片机的超声波满溢检测垃圾分类装置设计(025105)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/2 0:00:30 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/1 19:44:48 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/9/1 18:13:19 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/2 1:01:37 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/2 1:06:24 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/2 1:01:13 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/2 2:01:56 阅读更多 →