FastAPI 与执行方式:HTTP、同步和异步入门|课后复习

课堂课件 · 课前原始判断 · 本周导学

今天学会了什么

能把订单服务接到有字段合同的 HTTP 接口;能聚合两个独立异步查询,处理超时、单项失败和取消后的清理。

HTTP 请求与响应结构

在图上标出方法、路径、输入与响应,再对照你一次成功和失败请求;用等待实验补充说明服务端执行顺序。

今天讲了什么(对照复习)

下面逐项对应课堂正文。先盖住右边那一栏,凭记忆回答;卡住了再翻回左边同名的小节。光说得出名字不算会,还要能讲清它会做什么、什么时候会失效。

课堂对应章节必须能解释的机制与边界
从进程内调用走向系统间调用;API 不是“写几个路由”;一次 HTTP 对话的结构;方法、路径和资源;Path、Query 和 Body 放什么HTTP 合同包含方法、路径、输入、输出和错误;GET 查询、POST 创建/动作。Path 定位资源,Query 表达筛选,Body 表达结构化意图,不能与系统 PATH 混淆。
FastAPI 第一次使用:先建立可复现环境;FastAPI 的最小入口在当前 venv 安装冻结依赖,先验证 health;路由装饰器登记方法路径与函数。Uvicorn 的 module:app 表达模块和应用对象;运行、测试与浏览器端口证据分开。
OpenAPI 在这里做什么;三份信息必须互相对齐;用真实请求验证OpenAPI 是机器可读合同,Swagger UI 是查看和试调用界面;合同、Pydantic 实现、真实请求三方对齐。TestClient 是进程内测试,docs 能打开不证明接口及真实网络通过。
用 Pydantic 表达输入;输入模型和输出模型为什么分开;字段所有权是一条信任边界;为什么金额是两位小数字符串输入只表达客户、商品和数量等意图;价格、总额、订单 ID 与状态由服务端决定。strict 整数拒绝 true、字符串和小数,未知字段按合同拒绝;金额保持两位小数字符串,不改已有 MySQL/Decimal 链路。
状态码不是随便挑的数字;统一错误结构;request_id 为什么有用201 表示创建成功;404 为资源不存在;422 为结构或字段非法;409 为库存等业务冲突。code 供程序判断,message 给人,request_id 关联日志而非身份。超时/连接失败不能混同业务拒绝。
同步、异步、并发、并行分别在回答什么;先认识协程,再运行等待对照同步描述调用方等待结果,阻塞描述执行线程被等待占住;并发允许任务交替推进,并行需要同时执行资源。async def 调用先得到协程对象,asyncio.run 建立脚本运行入口;连续 await 仍顺序,gather 调度独立任务,返回顺序对应输入。
商品详情需要两个结果时,怎样等、怎样停asyncio.timeout 限制等待,取消发生后 finally 清理资源;实验核对 active 回到零。超时不证明外部写入没有发生;依赖步骤不能随意并发,也不能盲目重试创建。
为什么今天用同步函数;FastAPI 里为什么保留同步数据库路由;一个请求内的异步,不等于可靠后台任务同步 PyMySQL/SQLAlchemy 路由保留 def,框架在线程池执行同步路径操作;直接调用的普通辅助函数不会自动移入线程池。async def 内阻塞调用会占住事件循环。create_task 依赖当前进程,不能保证重启恢复,W03 再认识消息队列。

出了问题:怎么发现、怎么修、怎么验证

只在你自己那份课程副本或专用实验数据上复验,把改之前和改之后的真实结果都留下来。

风险/现象提前预防怎样发现怎样处理怎样复验
客户端金额或宽松转换被接纳输入输出模型分开,严格约束提交 true、字符串数量和多余金额字段修正 Schema 和服务端字段来源返回 422 且订单库存不变,正常输入仍成功
路径/错误语义与合同不一致逐端点对照 OpenAPI分别请求正常、未知、非法数量、库存不足修适配层和错误包络,保留业务规则核对 201/404/422/409 与 request_id
async 中阻塞或把顺序 await 当并发识别驱动类型和任务依赖比较执行轨迹、active/peak 与事件循环等待同步路由用 def,独立等待才并发调度轨迹符合预测,不能用模拟耗时冒充数据库提速
超时后泄漏资源或重复创建限定等待并清理,先查结果再决定重试触发受控超时,核对计数和数据库结果在 finally 清理;写操作按业务结果处理活动计数归零,已落库结果不重复写
后台任务只在内存却承诺完成明确任务生命周期和完成状态在独立实验中区分发起、等待与完成收紧承诺,记录需要持久队列的需求只报告实测状态,不把 create_task 当可靠交付

本日新增 Python 知识怎样进入商城

HTTP/FastAPI/Pydantic 合同;async def/await、协程与 Task、gather、timeout、cancel/finally、同步阻塞边界。它们共同支持“订单 HTTP 接口与商品详情多源等待”。我应能打开 detail_query.py 指出每个机制的位置,并重跑 正常商品/配送结果;两任务活动峰值;慢配送超时;商品失败取消同伴;真实 API 的 201/404/409/422。

风险提前预防怎样发现怎样处理怎样复验
失败后仍有任务运行保存自己创建的 Task 并 finally 收口退出后活动计数仍非零取消未完成任务并等待清理成功/超时/一项失败后都归零
把替身等待当真实提速记录模拟范围,数据库维持同步边界只有 sleep 耗时没有真实服务记录拆开本地机制和联调证据本地检查通过,真实接口另验

闭卷自测

先自己答一遍,再去运行或翻回课堂核对;不确定的地方标出来,别用 AI 的答案顶掉你自己的第一次判断。

  1. 为查订单和创建订单分别描述方法、路径、输入和结果;哪些字段不能由客户端决定?

  2. 数量 true、未知商品、库存不足分别应在哪一层拒绝?错误包络三项各给谁用?

  3. OpenAPI、Swagger UI、TestClient 与真实端口请求分别证明什么?

  4. 连续两次 await 与 gather 的轨迹有何不同?为什么先查库存再决定下单不能直接改成并发?

  5. 同步数据库函数放进 async def 为什么不会自动异步?超时后应怎样检查清理及业务副作用?

  6. 连续两次 await 与 create_task/gather 的执行顺序有何不同?一项失败后另一项怎样收尾?为什么超时不能证明远端写入已撤销?

再看一眼真实业务

将预习观察的加载和进度提示转换为接口需要表达的状态。实际页面只说明用户看到了什么,不能据此证明平台内部使用了协程或某个框架。

今天留下什么,下节课怎么接着用

同时保留本人 detail_query.py、活动任务峰值与结束归零结果;区分本地连接器替身和真实业务接口证据。

保留基础订单 API、OpenAPI、成功/错误合同测试、真实请求记录、顺序与并发及超时清理实验。W02-D04 用固定依赖和运行配置将它搬到另一运行环境。

今天基础入口限本地教学,最终订单中心还要接入 W03 登录授权。进程内等待模拟不能代表真实数据库或大模型性能。

补充交接:D04 保留同一版 API 与运营模块,在 Linux/容器中重建运行条件。本人 commerce_ops 每天增量合并,不用后一天骨架覆盖前一天实现。