【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)

book cover for the 2nd version

《API Testing and Development with Postman》最新第二版封面

文章目录

  • 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程
    • 1 前言
    • 2 准备工作
    • 3 具体部署
      • 3.1 将项目 Fork 到自己名下
      • 3.2 创建虚拟环境并安装依赖
      • 3.3 初始运行与项目调试
    • 4 示例项目的用法
    • 5 复盘与总结

写在前面
本篇完整介绍了贯穿全书的 todo-list 演示项目的本地部署过程,并结合亲身经历复盘了 AI 在整个过程中发挥的作用及今后应该注意的一些关键细节。一旦完成了该项目的本地部署,很多和项目本身无关的干扰因素都将降至最低,可以和本书作者的思路更加同步,还能进一步积累 Python 在 Web 应用快速开发方面的宝贵经验,可谓一举多得。本篇姑且可视为本次专栏的收尾篇,因为全书最主要的重点知识和难点环节都已经全部整理出来了。诚挚欢迎所有对 Postman 接口测试感兴趣的朋友前来交流心得,共同进步!

最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程


1 前言

2025 年 2 月 7 日,我顺利完成了高分实战专栏《Postman接口测试与开发实战》最后一篇自学笔记的梳理。系统复盘时才发现 示例 API 项目 的本地化问题一直没有解决。该项目是一个用 Python 搭建的待办清单简易应用,不仅开放了 API 接口和 OpenAPI 文档页,还提供了一个简易页面方便进行 CRUD 操作:

图 1:示例 API 项目首页效果图

【图 1:示例 API 项目首页效果图】

我试过按照 README 的提示进行操作,结果服务端虽然启动成功了,一访问门户首页就报 500 异常;但是接口文档页(即 Swagger 接口页)又能正常打开。随后几天我又在 GitHub Copilot 的提示下了解了 DjangoFlask 以及 FastAPI 相关的知识,才慢慢对这个示例项目有了点感觉。趁着刚学完 FastAPI 集成 SQLite 的新鲜劲,今天再次挑战一举拿下,便有了这篇复盘文章。

一旦解决了该项目的本地部署问题,原书《API Testing and Development with Postman, Second Edition》中的配套练习就无需再用 GitPod 的线上环境来搭建了;苛刻的无操作超时的问题也消失了;后续遇到新的测试需求也能第一时间在本地直接调试验证,可谓一举多得。

最关键的是,借助这次调试 Python 项目的实战经历,我对 AI 辅助编程又有了更立体的认识。

2 准备工作

相关前置准备工作如下:

  • Gitv2.45.1(能克隆 GitHub 项目就行);
  • 一个有效的 GitHub 帐号;
  • Pythonv3.11 及以上(示例项目要求);
  • Anaconda Promptv24.11.3(方便创建 Python 虚拟环境);

3 具体部署

3.1 将项目 Fork 到自己名下

示例项目地址:https://github.com/djwester/todo-list-testing

为了方便后续二次开发,最好将原项目复刻到自己名下:

img16.1

图 2:复刻原项目到自己名下

【图 2:复刻原项目到自己名下】

$ (pwd).Path
D:\sandbox
$ git clone git@github.com:SafeWinter/todo-list-testing.git
$ cd todo-list-testing

实测效果图:

图 3:将 Fork 后的示例项目克隆到本地

【图 3:将 Fork 后的示例项目克隆到本地】

3.2 创建虚拟环境并安装依赖

本地项目代码就绪后,再来创建一个 Python 虚拟环境 todolist(在 Anaconda Prompt 命令行中实现):

# 查看当前环境列表
> conda env list# conda environments:
#
base                *  C:\Users\ad\anaconda3
myenv                  C:\Users\ad\anaconda3\envs\myenv# 新建 todolist 环境
> conda create --prefix D:\conda_venvs\todolist python=3.11
# 配置自定义虚拟环境所在路径
> conda config --add envs_dirs D:\conda_venvs
# 切到 todolist 环境
> conda activate todolist
# 确认当前环境
> conda env list# conda environments:
#
base                   C:\Users\ad\anaconda3
myenv                  C:\Users\ad\anaconda3\envs\myenv
todolist             * D:\conda_venvs\todolist
>

关于虚拟环境的删除

如果哪天不需要该环境,则可使用以下命令彻底删除:

# 使用 conda env remove 命令
> conda env remove --prefix=D:\conda_venvs\todolist
# 如果上述命令不成功,则可手动删除
> rm -rf D:\conda_venvs\todolist
# 清理 Conda 缓存和元数据
> conda clean --all
# 验证操作结果
> conda env list

注意:

  1. 删除虚拟环境后,所有安装在该环境中的包和数据都会被清除,且无法恢复
  2. 如果虚拟环境正在使用中(已激活状态),请先停用该环境:conda deactivate

虚拟环境搭好后,根据 README 文档,需要安装 poetry 依赖管理工具:

> curl -sSL https://install.python-poetry.org | python -

其中:

  • -s--silent):静默模式,不显示进度条或错误信息;
  • -S--show-error):与 -s 一起使用时,如果请求失败,curl 会显示错误信息;
  • -L--location):如果请求的 URL 有重定向,curl 会自动跟随重定向;
  • -:表示标准输入(stdin),用于将 curl 下载的内容直接传递给 python 解释器执行。

然后进入刚才的示例项目根路径,利用 poetry install 安装所需依赖项:

(D:\conda_venvs\todolist) C:\Users\ad> D:
(D:\conda_venvs\todolist) D:\> cd sandbox\todo-list-testing
(D:\conda_venvs\todolist) D:\sandbox\todo-list-testing> poetry install
Installing dependencies from lock filePackage operations: 54 installs, 0 updates, 0 removals- Installing mdurl (0.1.2)- Installing colorama (0.4.6)
# ...- Installing requests (2.32.3)- Installing sqlalchemy (2.0.31)Installing the current project: todo-list (0.1.0)
Error: The current project could not be installed: No file/folder found for package todo-list
If you do not want to install the current project use --no-root.
If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.
If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.(D:\conda_venvs\todolist) D:\sandbox\todo-list-testing> 

可以看到,安装到最后有个报错(其实并不影响项目启动):

图 4:执行 poetry install 到最后显示的报错界面(不影响)

【图 4:执行 poetry install 到最后显示的报错界面(不影响)】

也可以根据提示再次运行 poetry install --no-root,警告就消失了:

图 5:添加 --no-root 选项后依赖安装过程就不报错了

【图 5:添加 --no-root 选项后依赖安装过程就不报错了】

3.3 初始运行与项目调试

到了这一步,项目就初步具备启动条件了,执行命令 poetry run uvicorn main:app --reload 即可运行服务端:

图 6:直接通过 poetry run 启动后台服务端(运行正常)

【图 6:直接通过 poetry run 启动后台服务端(运行正常)】

但只要在浏览器中访问首页 URL http://127.0.0.1:8000 则会报错:

img16.8

图 7:在浏览器打开项目首页看到的页面及后台报错情况

【图 7:在浏览器打开项目首页看到的页面及后台报错情况】

但此时访问接口文档页(GET /docs)却能正常打开:

图 8:示例项目的接口文档页可以正常打开

【图 8:示例项目的接口文档页可以正常打开】

为什么会报错呢?其实控制台最后一句话已经提示得很明显了(我之前一直没仔细看):某语句在调用 startswith 属性时报了空指针异常;但是控制台并没有给出具体的文件位置。根据 README 的操作提示可以得知,这里跳过了复制生成 .envrc 文件的步骤,其中定义了一个只在 Linux 系统生效的环境变量 DATABASE_URL

# 漏掉的命令:cp .envrc.example .envrc
# .envrc.example 只有一个语句:
export DATABASE_URL="sqlite+pysqlite:///./sql_db.db"

这就说明报错来自数据库的初始化。其实也可以用 VSCode 全局检索关键字 startswith,即可锁定问题出处:

图 9:在 VSCode 中全局检索 startswith 锁定后端报错的具体出处

【图 9:在 VSCode 中全局检索 startswith 锁定后端报错的具体出处】

这样就定位到了三处包含 startswith 方法调用的文件,打开任意一个,例如 database.py,可以看到如下内容:

def db_session():uri = os.getenv("DATABASE_URL")if uri.startswith("postgres://"):uri = uri.replace("postgres://", "postgresql://", 1)engine = create_engine(uri)Session = sessionmaker(autocommit=False, autoflush=False, bind=engine)db = Session()maybe_initialize_db(db, engine)with Session() as session:yield sessionsession.close()

注意第 2 至 4 行,这表明 uri 是从环境变量中读取 DATABASE_URL 的值,且项目还支持 postgreSQL 数据库;可惜实际运行时读取失败了。

为了在 Windows 系统中实现快速启动,这里直接导入一个硬编码的 uri 模块,并令其取值为默认字符串 "sqlite+pysqlite:///./sql_db.db"

于是新建模块 database/uri.py 并输入以下内容:

uri = "sqlite+pysqlite:///./sql_db.db"

然后分别导入报错的那三个文件,并进行如下调整:

# database/database.py
from database.uri import uri
# ...
def db_session():engine = create_engine(uri)# ...# create_tables.py
from database.uri import uri
# ...
engine = create_engine(uri)# remove_tables.py
from database.uri import uri
# ...
engine = create_engine(uri)

改好后,再次刷新浏览器页面,就能看到项目首页了(启动服务端时加了 --reload 选项支持动态更新):

图 10:对 uri 模块进行硬编码导入后看到的项目首页效果

【图 10:对 uri 模块进行硬编码导入后看到的项目首页效果】

4 示例项目的用法

该项目看似简陋,其实还包含了很多必要的功能点:

  • 用户登录:用户名可以是 user1user2admin,登录密码均为 12345
  • 只有自己创建的待办事项可以被删除;
  • 页面上可以修改待办事项的几个状态:DraftIn ProgressComplete
  • 如果存在删不掉的数据,可退出运行,并执行数据库初始化命令:poetry run python remove_tables.py

如果想调用 API 接口,则可以打开 GET /docs 页面利用 OpenAPI 接口规范生成的标准接口进行测试(如获取登录令牌 POST /token):

图 11:在 OpenAPI 接口页尝试发送 POST 请求获取登录令牌

【图 11:在 OpenAPI 接口页尝试发送 POST 请求获取登录令牌】

更多操作步骤,可以结合源码进行二次开发,加深对 API 接口调试的理解。

5 复盘与总结

这次的项目本地化实战其实走了很多弯路:明明可以从后台报错信息中直接找到解决方案,之前的几次尝试我都忽略了这个关键细节,反而让 GH Copilot 列出项目用到的主要技术栈,然后一个一个地去了解、一个一个从零学起。这么做不能说没用,毕竟项目调试始终存在一定的偶然性,全面了解项目用到的技术栈可以大幅提高调试的一次通过率;只是对于这个项目而言有点杀鸡用牛刀了——最终的解决方案(导出 uri 模块)和任何一个 Python Web 框架本质上都没有任何关系。说到底还是自己的粗心大意白白耽误了一周多的时间。

另一方面也可以看到,强大如 CopilotDeepSeek 这样的 AI 工具,其实是无法快速帮我锁定这个漏掉的关键细节的。它们只会按我给的思路和提示词进行回答,从这个角度来看,当下这些炙手可热的 AI 工具似乎又过于笨拙——因为真正有经验的老程序员,是一定会先问我报了什么错再来确定具体的解决方案的。因此,用好 AI 的关键,其实就在于能否从自身出发,切实培养出一系列良好的软件开发习惯,比如:问题导向、低耦合高内聚、重视测试用例……不一而足;能否在大家都能使用 AI 模型指导编程实践的情况下,直达问题本质,率先找到突破口。

这次实战也再次印证了 AI 工具 遇强则强 的特点。或许,今后无论 AI 如何发展,人与人之间的各种差距,可能都不会因为 AI 智能的大幅提升而被彻底消除;更有可能出现的情况是进一步加深人们在认知层面上的 “贫富差距”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年02月19日Github流行趋势

项目名称:OmniParser 项目地址url:https://github.com/microsoft/OmniParser 项目语言:Jupyter Notebook 历史star数:12878 今日star数:2153 项目维护者:yadong-lu, ThomasDh-C, aliencaocao, nmstoker, kr…

侯捷 C++ 课程学习笔记:设计模式在面向对象开发中的应用

在侯捷老师的《C 面向对象开发》课程中,除了对面向对象编程的基础特性(封装、继承和多态)的深入讲解外,还引入了设计模式这一高级主题。设计模式是面向对象编程中的一种最佳实践,能够帮助开发者解决常见的设计问题&…

前七章综合练习

一,拓扑图 二,实验要求 不限 三,实验步骤 第一步,搭建拓扑图 如上 注意: 第二步,配置IP trust: client1 client2 fw untrusrt-1: fw r3 电信DNS 百度web-1 untrust-2&#xf…

个人shell脚本分享

在周一到周五做增量备份,在周六周日做完全备份 #!/bin/bash定义变量 SRC“/path/to/source” # 源目录 BKUP“/backup” # 备份主目录 FUL“KaTeX parse error: Expected EOF, got # at position 22: …ull" #̲ 完全备份目录 INC"BKUP/inc” # 增量备份…

C语言之函数封装技巧

目录 前言 一、函数在源代码中的三种状态 二、函数封装的运用 案例1&#xff1a;实现打印20以内的素数 案例2&#xff1a;存放因子数并返回长度 三、return返回与形参返回 四、<>与“” 五、解耦 总结 前言 在C语言中&#xff0c;函数封装是一种重要的技巧&#…

深度神经网络终极指南:从数学本质到工业级实现(附Keras版本代码)

深度神经网络终极指南&#xff1a;从数学本质到工业级实现&#xff08;附Keras版本代码&#xff09; 为什么深度学习需要重新理解&#xff1f;&#xff08;与浅层模型的本质差异&#xff09; 模型类型参数容量特征学习方式适合问题类型浅层模型102-104手动特征工程低维结构化数…

vue3 + thinkphp 接入 七牛云 DeepSeek-R1/V3 流式调用和非流式调用

示例 如何获取七牛云 Token API 密钥 https://eastern-squash-d44.notion.site/Token-API-1932c3f43aee80fa8bfafeb25f1163d8 后端 // 七牛云 DeepSeek API 地址private $deepseekUrl https://api.qnaigc.com/v1/chat/completions;private $deepseekKey 秘钥;// 流式调用pub…

IIS asp.net权限不足

检查应用程序池的权限 IIS 应用程序池默认使用一个低权限账户&#xff08;如 IIS_IUSRS&#xff09;&#xff0c;这可能导致无法删除某些文件或目录。可以通过以下方式提升权限&#xff1a; 方法 1&#xff1a;修改应用程序池的标识 打开 IIS 管理器。 在左侧导航树中&#x…

代码解读:如何将HunYuan T2V模型训练成I2V模型?

Diffusion models代码解读:入门与实战 前言:HunYuan T2V模型出来很久了,但是想要训练成I2V的模型还是有点难度。此外,还有很多预训练视频模型都是T2V的,可以借鉴本文的方法加入参考图作为条件,并严格保持视频的第一帧与Image一样。 目录 Patch Image Padding Channel …

windows事件倒计时器与提醒组件

widgets 这是桌面组件前端开源组件&#xff0c;作者称&#xff1a;项目还在持续完善中&#xff0c;目前包含键盘演示、抖音热榜、喝水提醒、生日列表、待办事项、倒计时、灵动通知、打工进度等多个组件 有vue编程能力的可以自己做组件 百度网盘 夸克网盘 桌面组件 | Ca…

汽车零部件工厂如何通过工业一体机实现精准控制

在汽车制造行业中&#xff0c;零部件的精度和质量直接关系到整车的性能与安全。随着汽车工业的快速发展&#xff0c;汽车零部件工厂对生产过程的精准控制提出了更高的要求。传统的生产管理模式往往依赖人工操作和分散的系统&#xff0c;难以满足现代汽车零部件工厂的需求。而工…

BMS保护板测试仪:电池安全与性能的坚实守护者

在新能源汽车、储能系统、电动工具等电池驱动型产品日益普及的今天&#xff0c;电池的安全性和性能成为了人们关注的焦点。而BMS保护板测试仪作为电池管理系统&#xff08;BMS&#xff09;中不可或缺的一部分&#xff0c;为电池的安全运行提供了有力保障。 BMS保护板测试仪的重…

Django的初步使用

1.安装Django pip install django 验证是否安装成功&#xff1a; $ python3 Python 3.8.10 (default, Jan 17 2025, 14:40:23) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >…

(前端基础)CSS(一)

了解 Cascading Style Sheet&#xff1a;层叠级联样式表 CSS&#xff1a;表现层&#xff08;美化网页&#xff09;如&#xff1a;字体、颜色、边框、高度、宽度、背景图片、网页定位、网页浮动 css优势&#xff1a; 内容和表现分离网页结构表现统一&#xff0c;可以实现复用…

CASAIM与韩国DOOSAN集团达成合作,开启工业制造自动化检测新篇

近日&#xff0c;CASAIM与韩国知名跨国企业斗山集团&#xff08;DOOSAN&#xff09;达成战略合作&#xff0c;联合打造CASAIM全自动化智能检测系统&#xff0c;助力斗山集团全面提升产品质量检测精度与效率&#xff0c;完成智能化检测升级&#xff0c;保持在全球市场竞争中的领…

矛盾(WEB)

##解题思路 打开靶场就是一段自相矛盾的代码&#xff0c;既要num是数字类型&#xff0c;又要判断为1 这种情况我们会想到弱类型的编程语言&#xff0c;插件查看过后&#xff0c;php就是弱类型的语言&#xff0c;此处并非是严格相等&#xff0c;只是 因此可以根据弱类型编程语言…

[AI]docker封装包含cuda cudnn的paddlepaddle PaddleOCR

封装,启动时需要在GPU服务器上 显卡驱动 cuda等下载需要注册账号 环境Ubuntu 24.04 LTS镜像uvicorn-gunicorn-fastapi:python3.8显卡支持版本CUDA Version: 12.5cuda版本cuda_12.4.0_550.54.14_linux.runcudnn版本PaddlePaddle-GpuPaddleOCR 启动进入容器 docker run --gpus …

idea连接gitee(使用idea远程兼容gitee)

文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功

VisionTransformer(ViT)与CNN卷积神经网络的对比

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Java并发编程面试题:锁(17题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…