当前位置: 首页 > article >正文

【玩转 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 智能的大幅提升而被彻底消除;更有可能出现的情况是进一步加深人们在认知层面上的 “贫富差距”。

相关文章:

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

《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…...

高清下载油管视频到本地

下载工具并安装: yt-dlp官网地址: GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址: Download FFmpeg 注:记住为其添加环境变量 操作命令: 该指令表示以720p码率下载VIDEO_UR…...

网络运维学习笔记 021 HCIA-Datacom新增知识点02 SDN与NFV概述

SDN与NFV概述 经典IP网络是一个分布式的、对等控制的网络。 每台网络设备存在独立的数据平面、控制平面和管理平面。 设备的控制平面对等的交互路由协议,然后独立的生成数据平面指导报文转发。 它的优势在于设备与协议解耦,厂家间的兼容性较好且故障场景…...

《论模型驱动架构设计方法及其应用》审题技巧 - 系统架构设计师

软件测试工程师软考论文写作框架 一、考点概述 “模型驱动架构设计及其应用”这一论题,主要考察了考生对模型驱动架构设计(MDA)这一先进软件设计方法的理解与应用能力。论题涵盖了MDA的基本概念、核心要素、实施流程及在实际项目中的应用等…...

【Linux】多线程 -> 线程同步与基于BlockingQueue的生产者消费者模型

线程同步 条件变量 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。 例如:一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将一个节点添加到队列中。这…...

Docker Mysql 数据迁移

查看启动命令目录映射 查看容器名称 docker ps查看容器的启动命令 docker inspect mysql8.0 |grep CreateCommand -A 20如下图所示:我这边是把/var/lib/mysql 目录映射到我宿主机的/mnt/mysql/data目录下,而且我的数量比较大使用方法1的话时间比较久,所以我采用方法2 如果没…...

四步彻底卸载IDEA!!!

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好,我们今天来学习四步彻底卸载IDEA!!! 首先我要提醒各位 如果你想删除 IDEA 相关&#xf…...

HTTP实验(ENSP模拟器实现)

HTTP概述 HTTP(HyperText Transfer Protocol,超文本传输协议),设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP定义了多种请求方法,常用的包括: GET:请求资源。 POST&…...

【网络安全】常见的web攻击

1、SQL注入攻击 定义: 攻击者在HTTP请求中注入恶意的SQL代码,当服务器利用参数构建SQL语句的时候,恶意的SQL代码被一起构建,并在数据库中执行。 示例: 用户登录: 输入用户名xx, 密码 or 1 …...

登录-05.JWT令牌-介绍

一.JWT令牌 JWT令牌是一种简洁的、自包含的格式,用于在通讯双方之间以json数据格式安全的传输数据。说白了,JWT令牌就是将json格式的数据进行封装,从而实现安全传输。 所谓简洁,就是指JWT令牌就是一个简单的字符串。 所谓自包含…...

K8S下redis哨兵集群使用secret隐藏configmap内明文密码方案详解

#作者:朱雷 文章目录 一、背景环境及方案说明1.1、环境说明1.2、方案一:使用配置文件设置密码1.3、方案二:使用args 的命令行传参设置密码 二、redis secret configmap deployment参考2.1 创建secret-redis.yaml参考2.2 修改configmap配置参…...

Spring框架基本使用(Maven详解)

前言: 当我们创建项目的时候,第一步少不了搭建环境的相关准备工作。 那么如果想让我们的项目做起来方便快捷,应该引入更多的管理工具,帮我们管理。 Maven的出现帮我们大大解决了管理的难题!! Maven&#xf…...

spring boot知识点4

1.如何监视所有spring boot微服务 安装actuator插件,然后通过接口查询 /actuator/health 2.spring boot项目性能如何优化 a.优化启动时间,去除重复的依赖 b.JVM优化(java虚拟机优化),限制堆的最小最大值 c.数据库…...

简识Spring创建Bean方式和设计模式

一、理论解释&#xff1a; Spring在创建Bean时主要有四种方式&#xff0c;这些方式分别涉及到了不同的设计模式。以下是具体的创建方式及对应的设计模式&#xff1a; 通过反射调用构造方法创建Bean&#xff1a; 方式&#xff1a;在Spring的配置文件中&#xff0c;使用<bean…...

归并排序 Listnode* vector<int> vector<ListNode*>

加粗样式 ListNode* merge(ListNode* l1,ListNode* l2){ListNode* dummyheadnew ListNode(0);ListNode* curdummyhead;while(l1&&l2){if(l1->val>l2->val){cur->nextl2;l2l2->next;curcur->next;}else if(l1->val<l2->val){cur->nextl1…...

深度解析:大模型在多显卡服务器下的通信机制与分布式训练——以DeepSeek、Ollama和vLLM为例

一、引言&#xff1a;大模型与多显卡的必然结合 随着大模型参数规模突破千亿级&#xff08;如GPT-4、DeepSeek&#xff09;&#xff0c;单显卡的显存容量与算力已无法满足需求。多显卡并行计算成为训练与推理的核心技术&#xff0c;其核心挑战在于高效通信与负载均衡。本文以国…...

鸿蒙NEXT应用App测试-专项测试(DevEco Testing)

注意&#xff1a;大家记得先学通用测试在学专项测试 鸿蒙NEXT应用App测试-通用测试-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注…...

达梦数据库学习笔记@1

目录 达梦数据库学习笔记一、表空间管理&#xff08;一&#xff09;默认表空间&#xff08;二&#xff09;相关数据字典&#xff08;三&#xff09;表空间操作&#xff08;四&#xff09;临时表空间管理 二、重做日志管理&#xff08;一&#xff09;系统视图&#xff08;二&…...

设计模式| 观察者模式 Observer Pattern详解

目录 一、概述1.1 动机1.2 核心思想1.3 别名 二、角色与实现原理2.1 角色2.2 实现原理2.3 类图 三、经典接口实现3.1 示例3.1.1 观察者接口3.1.2 目标接口3.1.3 具体被观察者3.1.4 具体观察者3.1.5 Client3.1.6 UML时序图 3.2 特点 四、其他实现方式4.1 委托与事件&#xff08;…...

时间转换(acwing)c/c++/java/python

读取一个整数值&#xff0c;它是工厂中某个事件的持续时间&#xff08;以秒为单位&#xff09;&#xff0c;请你将其转换为小时&#xff1a;分钟&#xff1a;秒来表示。 输入格式 输入一个整数 NN。 输出格式 输出转换后的时间表示&#xff0c;格式为 hours:minutes:second…...

Rocky8 源码安装 HAProxy

HAProxy 是一款开源的高性能 负载均衡器 和 反向代理 软件&#xff0c;专注于处理高并发流量分发&#xff0c;广泛应用于企业级架构中提升服务的可用性、扩展性和安全性。 一、HAProxy 简介 1.1.HAProxy 是什么&#xff1f; 本质&#xff1a; 基于 C 语言开发 的轻量级工具&a…...

通过AI辅助生成PPT (by quqi99)

作者&#xff1a;张华 发表于&#xff1a;2025-02-23 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 问题 媳妇需要将一个pdf文件中的某些部分做成PPT课件&#xff0c;我在想是…...

【从0做项目】Java文档搜索引擎(9)烧脑终章!

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 文章导读 零&#xff1a;项目结果展示 一&#xff1a;导入 二&#xff1a;问题引入 1&#xff1a;情…...

什么是 Cloud Studio DeepSeek ; 怎么实现Open WebUI快速体验

什么是 Cloud Studio DeepSeek ;怎么实现Open WebUI快速体验 一、概述 欢迎使用 Cloud Studio DeepSeek 工作空间!我们已为您预装并启动了以下服务,等待加载十几秒即可查看效果: Ollama 服务:支持通过 API 调用 DeepSeek 模型。 AnythingLLM 前端服务:提供交互式聊天界…...

rtconfig.cpython-313.pyc 在 .gitignore文件中写入 *.pyc 文件仍然没有被忽略?

在 .gitignore 文件中添加 *.pyc 和 *.*.pyc 规则时&#xff0c;如果 .pyc 文件仍然没有被忽略&#xff0c;可能有以下几种原因&#xff1a; 1. 已经被 Git 跟踪的文件 即使您在 .gitignore 中指定了忽略 .pyc 文件&#xff0c;Git 仍然会跟踪已经被提交到版本库中的文件。如…...

Linux 第二次脚本作业

1、需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 2、设计一个 Shell 程序&#xff0c;在/userdata 目录下建立50个目录&#xff0c;即 user1~user50&#xff0c;并设置每个目录的权限&#xff0c;其中其他用户的权…...

mysql的源码包安装

安装方式一&#xff1a;&#xff08;编译好的直接安装&#xff09; 1.添加一块10G的硬盘&#xff0c;给root逻辑卷扩容 &#xff08;下面安装方式二有&#xff0c;一模一样的装就行&#xff0c;我就不写了&#xff0c;再写的话篇幅就太长了&#xff09; 2.下载编译好的源码包…...

《论面向对象的建模及应用》审题技巧 - 系统架构设计师

论面向对象的建模及应用写作框架 一、考点概述 本论题“论面向对象的建模及应用”主要考察软件测试工程师对面向对象建模技术的理解和应用能力。具体涵盖以下几个方面&#xff1a; 面向对象建模的基本概念 &#xff1a;这包括理解面向对象编程&#xff08;OOP&#xff09;的基…...

#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…...

Sky Hackathon 清水湾的水 AI美食助手

这里写自定义目录标题 视频 视频 video...