自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(151)
  • 收藏
  • 关注

原创 下篇 实战篇:FastAPI + Nginx 的 8 个救命配置

上篇讲的是“为什么需要 Nginx”,下篇直接进配置现场。每一个配置都对应一个用户能直接感知的故障:上传被拒、长任务超时、AI 回答不逐字、WebSocket 连不上、静态页面刷新 404、恶意刷接口拖慢全站。每个坑我们都给现象、原因、正确写法。

2026-10-25 13:47:34 532

原创 上篇 认知篇:先搞懂 Nginx 在用户背后干的 10 件事

这个地址本身就在告诉用户:这是个临时的东西,没有域名,没有证书,端口号都懒得藏。地址栏干净了,浏览器有锁了,页面和图片由 Nginx 直接读磁盘返回,上传大文件不再被一秒拒绝,AI 回答逐字出现,WebSocket 也不会一直卡在“连接中”。React/Vue 打包后的 JS、CSS、图片,以及 FastAPI 的静态资源,由 Nginx 直接读磁盘返回,不经过 Python 进程。这是“隔离”的价值,用户感受不到,但少了它,高峰期就是灾难。用户看到的是浏览器地址栏的锁图标,不用担心请求在传输中被窃听。

2026-10-25 13:42:40 432

原创 一个 yield,两副面孔:省下五个数量级的内存,只是它的起点

正是这些能力,让生成器从“数据源”变成了“可双向通信的协程”,并最终在 FastAPI 的 Depends()、contextmanager 等框架机制中反复出现。这个“可暂停、可恢复”的边界,是后面所有高级用法的起点。yield 的第二副面孔解决的是“通信与生命周期”问题:它可以在暂停点接收值、接收异常、接收终止信号,可以把迭代委托出去,也可以把“前置 + 后置”的结构封装成上下文管理器或框架依赖。yield 的核心,不是“生成一个序列”,而是在函数执行过程中划出一个可暂停、可恢复、可双向通信的边界。

2026-10-24 16:39:34 328

原创 下篇:测试不是脚本——用 pytest-dependency 管理用例执行前提

如果依赖跨越不同测试模块,必须显式设为 session 或 package,并在 depends 中使用完整的节点路径,例如 "tests/test_auth.py::test_login"。开启后,禁止未显式声明却实际存在隐式调用关系的测试组合,推动团队在测试设计中显式表达依赖,而不是靠偶然的执行顺序。pytest-dependency 解决的是执行前提问题:被依赖的测试失败或被跳过时,依赖它的测试自动跳过,而不是继续执行并产生误导性失败。一个测试可以同时依赖多个前置测试,所有依赖都通过它才会执行。

2026-10-24 16:30:55 361

原创 上篇:从“每个路由都写一遍”到“声明即注入”——FastAPI Depends() 实战指南

不用依赖注入的 FastAPI 代码,横切逻辑会反复出现在每个路由函数里:解析 Token、查当前用户、开数据库会话、校验分页参数。同一个请求内,同一个依赖被多次声明时,FastAPI 默认只执行一次,后续复用第一次的返回值。需要从请求中提取数据供依赖使用:依赖函数可以声明 Header、Query、Path 参数,框架自动解析。反例:只服务单个端点、不碰外部资源、也不需要提前拦截的几行逻辑,直接写在路由里更清楚。依赖之间有层级关系:先拿数据库会话,再拿当前用户,再拿用户权限。

2026-10-24 16:29:16 396

原创 让注解在编译时“写代码”——自动生成 Builder

这次我们要用的注解,生命周期在编译时(SOURCE),它不进入 .class 文件,而是由注解处理器在编译阶段读到,然后生成新的 .java 源文件,之后再一起编译成 .class。编译时,如果我们让 javac 运行处理器,就会自动在 build/generated-sources/ 之类的目录下生成 OrderBuilder.java。无论是运行时读注解的反射框架,还是编译时代码生成器,本质上都是程序读程序,让开发效率成倍提升。OrderBuilder 完全由注解在编译时自动生成,你零手写成本。

2026-07-26 21:10:50 238

原创 把注解当“便利贴”——运行时自动识别字段

效果:哪天订单表多了个字段,开发人员只要在那个字段上加一个注解,导出的Excel就会自动多一列,不用去修改导出器的核心代码。每个订单对象有几十个字段,程序员每次写导出代码都要手动列出“商品名对应A列、价格对应B列”,太容易出错,而且以后字段一改,到处都要改。它对程序的运行逻辑没有直接影响,但编译器、框架、或者我们自己写的工具,可以去读这些“便利贴”上的信息,然后决定怎么做。我们能不能在订单类的字段上直接写好“这是哪一列、什么标题”,让程序自己去读这些配置?现在我们要自己定制一个便利贴,让导出工具能读懂。

2026-07-26 21:08:04 460

原创 ArrayList:你手机里那个“无限容量且秒翻页”的智能订单列表

你(用户)在使用 App 时,每一次下拉刷新(遍历)、每一次点击详情(随机访问)、每一次删除购物车商品(移除元素)、每一次消息记录增长(自动扩容),背后都是 ArrayList 在替你扛着“数据搬家和快速寻址”的苦活。ArrayList 的核心作用就是:给软件装上一个“有记忆、能伸缩、会排序、秒定位”的超级列表,让你(用户)所有的“历史记录、聊天消息、商品浏览轨迹”都能顺滑滚动、精准跳转,绝不丢数据、绝不卡页面。你的体验:你看微信聊天记录,永远按照时间顺序(最早的在上,最新的在下)。你刚发的一条“在吗?

2026-07-20 23:21:00 199

原创 HashMap:你手机里那个“毫秒级必达”的超级智能快递柜

这叫 O(n) 线性查找。你根本不用告诉系统“我的包裹大概在左边还是右边”(遍历),你只需要报出你的取件码(Key),系统通过数学魔法(哈希算法),直接算死你的包裹在哪个坐标,咻的一下弹开柜门。HashMap 的核心作用就是:给软件装上一颗“瞬间定位”的大脑,让你(用户)所有的“根据 XX 查 YY”的操作,都做到“秒级响应”,绝不让你多等一秒钟。Java 里的“快递柜”不只是基础款,针对你(用户)不同的使用习惯,有 5 种变体,程序员根据场景选对类型,你的体验才能“飞起”。遍历的时候,先放进去的先出来。

2026-07-20 23:16:59 324

原创 多线程:让你的 App 从“单行道”变成“立体交通枢纽”

痛点 1(界面冻结,点哪哪死):如果没有多线程,你点“下载 1GB 的游戏安装包”时,整个 App 画面会一动不动,连“取消”按钮都点不了,你以为手机死机了。你感受到的所有“丝滑、秒开、多任务、不卡死”,本质上都是多线程在底层把你一个人独占 CPU 的“特权”剥夺了,换成所有用户共享 CPU 时间片,但正因如此,每个人反而都感觉自己在独占整个系统。Java 里的多线程不是乱来的,有 5 种典型的“线程角色”,程序员根据你的操作场景选派不同工种,目的只有一个:让你(用户)的操作极速响应,永不阻塞。

2026-07-20 22:33:31 521

原创 Java常量三剑客:public、static、final,少一个都是线上事故的伏笔

但利率、圆周率、系统版本号是所有对象共有的),就一定要加 static,目的就是节省内存、提升性能、方便调用(不用 new 对象直接 类名.变量)。凡是“全局通用的固定值”,比如:汇率、活动折扣率(如全场 8 折)、状态码(SUCCESS = 1)、配置前缀(REDIS_KEY_PREFIX = "user:"),统统用 final,目的就是防小人、防手滑、保资损。上线后,所有正常用户的借款利息翻倍,用户炸锅,资损数百万,小王被开除。com.risk.public 包(对外 API,接收用户请求)

2026-07-19 19:05:54 304

原创 AOP(面向切面编程)

AOP = 面向切面编程,把所有方法共用的「通用附属功能」抽离成独立一块(切面 Aspect),不改动原有业务代码,自动在目标方法执行前后 / 异常时插入通用逻辑。@Around前置代码 → @Before → 执行业务方法 → @AfterReturning → @After → @Around后置代码。程序启动时自动生成目标类的代理对象,调用方法时先走切面逻辑,再走原业务代码,完全不用修改原有业务代码。一句话总结:业务代码只写核心业务,日志、权限、监控、事务、限流全部交给切面统一处理。

2026-07-19 13:12:30 472

原创 Config 配置类层

如果你感觉一个 App“很流畅、很聪明、很少出错”,那背后一定有一个极其强大的 Config 层,把所有可能让你不爽的坑,全都提前悄悄填平了。站在你(顾客)的角度,这个“后台”(Config 层)必须帮你搞定下面这 4 件决定体验的大事,缺一不可。作为顾客(也就是软件使用者),你根本看不到这个后台长什么样,但你享受的所有“丝滑体验”和“个性化服务”,都是这个后台在背后调度好的。你的体验:下单后,刚好支付宝接口超时,但你完全没有感到异常,1秒后订单依然显示“支付成功(银行直连备用通道)”。

2026-07-19 12:40:19 175

原创 面向对象三大特性深度剖析:封装、继承、多态,以及重载与重写的本质区别

由于 process() 是基类的非抽象方法(且 final),实际上调用的是基类的 process(),但基类的 process() 内部调用了 doPay(),而 doPay() 被子类重写,因此最终执行的是子类的 doPay()。继承是一种“is-a”关系,子类继承父类的非私有属性和方法,并可以添加新的字段和方法,或重写父类方法。父类应为抽象类,定义模板方法。更进一步,如果我们在基类中也将 process() 定义为抽象(或非 final),则可以直接重写整个流程,但当前设计更符合模板方法模式。

2026-07-18 22:43:14 759

原创 springboot启动流程

MapperScan("com.bear.hospital.mapper") 单独扫描 mapper 包,自动给所有 Mapper 接口生成代理实现类,注入容器,Service 才能直接 @Autowired 注入 Mapper 操作数据库。读取 META-INF/spring.factories 文件,提前加载所有场景自动配置类(MyBatis、Redis、Web、Tomcat 等),这就是 Spring Boot 自动配置的核心来源。

2026-07-18 22:12:33 228

原创 从用户点餐到订单完成:一个外卖请求如何穿越SpringBoot项目

而 application-dev.yml 是开发环境的分控面板(连测试库,日志详细),application-prod.yml 是生产环境的分控面板(连正式库,日志精简)。验身通过后,UserContext(线程上下文)会把当前登录用户的ID存进ThreadLocal——这相当于给这个请求贴上一张"当前顾客是谁"的便签,后续所有处理环节都能随手取用,不用层层传参。理解了这个流程,你就不仅知道了"某个文件是干什么的",更明白了"为什么需要它"——因为用户的一次点击,就是一次横跨整个技术栈的旅行。

2026-07-18 22:01:50 450

原创 单体与微服务区别

二、工程代码结构差异(重点) 单体项目结构 单模块工程,内部分包分层:controller/service/mapper/entity/common全部代码在一个模块,公共工具、业务、配置都在当前项目内部。按业务领域拆分成多个独立 SpringBoot 子项目(用户服务、订单服务、商品服务、网关等),每个服务独立工程、独立数据库、独立部署。所有业务代码写在同一个 SpringBoot 项目、一个 Jar 包:用户、商品、订单、支付、文件上传全部耦合在一起,共享一个数据库。缺点:代码臃肿,百万行后维护灾难。

2026-07-18 21:55:32 228

原创 单体项目结构

前端请求 → Controller → DTO 接收参数 → Service 业务层 → Mapper 持久层 → MySQLService 层可调用:Redis 工具、OSS 工具、自定义工具、ThreadLocal 上下文、定时任务。1. controller 控制层只做三件事:接收参数、调用 service、返回统一 Result,禁止写业务逻辑。2. service 业务层核心业务、事务、多表操作、缓存逻辑、数据组装;8. common全局公共代码:工具、异常、返回体、常量、上下文。

2026-07-18 21:44:31 372

原创 WebSocket:Web 世界的“双工电话线”与“实时对话桥梁”

对于普通 Web 用户而言,WebSocket 就是你每次打开聊天软件、玩在线游戏、看实时股价时,那种“根本感觉不到它在传输数据,但数据就是实时到了”的魔法。你们之间仿佛有一根“电话线”,随时可以说话,随时可以听到对方的声音。从此,双方都可以直接发送“帧(Frame)”数据,不需要请求头、不需要状态码、不需要 Cookie(或者可以带,但携带方式不同),极其轻量。它通过一次 HTTP 握手(这个握手叫“升级协议”),把普通的 HTTP 连接“升级”为 WebSocket 连接,然后这个连接就一直不关了。

2026-07-15 20:19:27 515

原创 Server-Sent Events (SSE):让服务器“主动开口”的实时推送技术

但如果用传统的 Web 技术来实现,情况会非常滑稽:你发出提问后,服务器要憋 30 秒,等整篇 1000 字的文章全部生成完毕,一次性把完整的文本打包发给你。在技术实现上,SSE 非常轻量。当你问它“帮我写一篇关于 AI 的文章”时,屏幕上的文字不是一个字一个字突然蹦出来的,而是像有人在你面前打字一样,一个字一个字地流式浮现。SSE 的核心机制就是:客户端发起一个普通 HTTP 请求后,服务器不关闭连接,而是保持这个连接“打开”状态,并持续不断地向客户端推送数据块(数据块),直到数据传输完毕或超时。

2026-07-15 20:14:22 508

原创 Tool Calling:让 AI 从“纸上谈兵”变成“动手实干”

AI 不再是只能输出文本,而是可以在需要的时候输出一个结构化的“调用指令”,由你的应用去真正执行这个操作(查天气、算算术、发邮件),然后把结果喂给 AI,让它基于真实结果给出最终回答。它把“用户的一句话”翻译成“标准化的工具调用指令”,再把“工具执行结果”翻译成“用户听得懂的人话”。”传令兵跑出去测完,把“12.5 里”的结果拿回来,军师才告诉你“准确距离是 12.5 里”。全是推测,没有依据。用户感知:你说“帮我取消我刚下的那个订单”,AI 自动查了你的订单列表,找到最新的那个,帮你提交了取消申请。

2026-07-14 20:39:32 735

原创 Python asyncio 深度并发:驾驭大模型调用的“车水马龙”

Python 的 asyncio 配合 aiohttp/httpx,再加上 Semaphore(信号量)、asyncio.gather、asyncio.timeout 和 run_in_executor 这几个大杀器,能让你像操控精密仪器一样,精准控制并发流量、批量处理任务、设置安全保险丝,并确保事件循环永远不卡死。有反馈的失败,好过无尽的沉默。需求:一个客户发起复杂请求,需要同时咨询“法律顾问”(调 API A)、“车险定损员”(调 API B)和“医疗专家”(调 API C),最后汇总意见。

2026-07-14 20:30:44 449

原创 python中的异常处理

更优雅的写法(推荐):实际开发中,操作文件通常用 with open(...) as file,它会自动处理 finally 的关闭逻辑,但上面例子清晰地展示了 finally 的底层作用。在 Python 中,异常处理是一种让程序在遇到运行时错误(而非语法错误)时,不至于直接崩溃退出,而是能够“捕获”错误并执行预先设定好的“补救”或“善后”代码的机制。适可而止:异常处理有性能开销,只对真正可能出错的“边界”代码(如 IO、网络请求、用户输入)使用,不要在普通的循环和数学计算中大量滥用。

2026-07-12 12:17:21 234

原创 Python 异常处理:Web 服务的“安全气囊”与“故障保险”

当服务器真的出了故障,它至少会给你一个“我们正在紧急修复,请稍后再来”的体面交代——而不是让你面对满屏看不懂的代码报错。它让代码不再是“玻璃心”——一碰就碎,而是变成了“皮实耐造”的工业级产品。无论风吹雨打(数据库故障、网络超时、恶意攻击),你的服务都能优雅地应对,而不是轻易崩溃。在实际的 Web 开发中,意外情况随时可能发生:数据库连接突然断了、用户传入了一个非法格式的数据、调用的第三方支付接口超时了、服务器磁盘满了……Python 的异常处理机制,就是你的 Web 服务的“安全气囊”和“故障保险”。

2026-07-12 12:13:42 327

原创 SQLAlchemy:Web 后端与数据库之间的“万能翻译官”

没关系,翻译官会自动切换语言,你完全不需要改变下达指令的方式。更可怕的是,你在代码里写 "SELECT * FROM users WHERE id = " + user_id,如果 user_id 是用户从网页输入框里填的,黑客完全可以输入 1 OR 1=1 把你的整个用户表拖走——这就是臭名昭著的 SQL 注入攻击。它把繁杂的数据库操作抽象成了 Python 程序员最熟悉的面向对象语法,把不同数据库的方言差异抽象成了统一的 API,把 SQL 注入、连接管理等安全问题抽象成了框架的自动处理。

2026-07-08 21:38:07 444

原创 FastAPI 静态文件:Web 页面的“固定展柜”与“加速引擎”

当你打开一个网站时,除了看到动态变化的内容(如新闻列表、用户头像、商品价格),你还会看到很多相对固定的东西:网站的 Logo 图片、CSS 样式文件(决定了页面的颜色、布局、字体)、JavaScript 脚本文件(决定了页面的交互逻辑,比如下拉菜单、轮播图)。在现代 Web 开发中,前端(Vue/React)和后端(FastAPI)经常是分离的。在 Web 世界里,HTML 页面、CSS 样式表、JavaScript 脚本、图片(PNG/JPG)、字体文件(.woff)、PDF 文档等,都属于静态文件。

2026-07-08 21:32:55 399

原创 Python RESTful API:告别混乱的接口命名,拥抱统一的资源世界

但如果你误点了“提交订单”按钮(POST /orders),浏览器会弹窗提示“是否重新提交表单”——因为浏览器知道 POST 是不安全的操作,会给你二次确认的机会。用户浏览商品(GET /products),加入购物车(POST /cart/items),下单(POST /orders),查看订单(GET /orders/123)。用户发帖(POST /posts),查看帖子(GET /posts/5),编辑帖子(PUT /posts/5),删除帖子(DELETE /posts/5)。

2026-07-07 20:47:42 339

原创 你点外卖、刷视频、查天气的背后,都藏着同一个“快递规则”——Python RESTful 是干什么的?

整个过程,RESTful 就像一套全球通用的快递单号规则——只要寄件人(你的手机)和收件人(服务器)都按这套规则填单,包裹就能准确、快速地送达,不会把“修改密码”的请求送到“删除账户”的地址去。你不需要知道它是什么,因为你每一次上网——刷新闻、传照片、叫外卖、查快递——它都在默默帮你把“我要做什么”翻译成“服务器能听懂的命令”,然后再把服务器的回答翻译成你能看懂的图片、文字、视频。你修改昵称后点“保存”(POST/PUT),还是同样的网址,但服务器知道你是要修改,而不是再看一遍。

2026-07-07 20:27:08 236

原创 Python 异步编程:Web 服务的“全能服务员”与“高效调度大师”

异步模式(Asynchronous)—— 现代 Python 写法:厨师接到订单后,把菜下锅,然后立刻离开灶台,去切下一桌的菜,去处理打包,去接外卖电话。在炒菜的 10 分钟里,他一动不动地盯着锅,哪怕旁边有新的客人进来点单,他也完全不理会(卡住了),必须等这桌菜全部做完端上桌,他才开始接待下一桌客人。Web 服务的本质,就是 CPU 在处理请求时,大量时间都在“等待”——等待数据库返回查询结果(几十毫秒),等待第三方 API 响应(几百毫秒),等待文件读写(几毫秒),等待网络传输。还有没有新任务要执行?

2026-07-07 20:22:50 696

原创 Python 装饰器:FastAPI 路由背后的“智能包装流水线”

在 FastAPI 的世界里,装饰器就像是一台 “智能包装流水线”——你把一个普通的 Python 函数放上去,流水线会自动给它装上“路由映射”、“参数校验”、“文档生成”等全套 Web 功能,然后把它变成真正的 API 接口。当你写下 @app.get("/users") 时,你其实是在对 FastAPI 框架说:“请把这个普通的 Python 函数,包装成一个符合 RESTful 规范的 Web 接口,并把它挂到 URL 地图上。函数的定义和路由的注册是分离的,代码的可读性非常差。

2026-07-07 20:20:22 333

原创 FastAPI CORS 跨域:Web 世界的“小区门禁”与“访客通行证”

想象一下这个场景:你作为前端开发人员,在电脑上运行着一个 Vue 项目(地址是 http://localhost:3000),同时后端同事的 FastAPI 服务跑在 http://localhost:8000。当你在一个网页里点击“使用微信登录”、在电商平台查看跨域加载的推荐商品、或在使用单页应用(SPA)时流畅地点击各个功能,都是 CORS 机制在后端服务器的配合下,悄无声息地打开了浏览器同源策略的“绿色通道”。CORS 解决的是“浏览器能不能访问”的问题,而不是“有权限的人能不能访问”的问题。

2026-07-06 22:39:46 156

原创 FastAPI 中间件:Web 服务的“统一安检闸口”与“前置过滤器”

浏览器出于安全策略,会拦截跨域请求。它在你点击页面的那一瞬间,默默完成了日志记录、安全扫描、流量控制、数据压缩等无数杂务,而你只能感知到结果——页面加载更流畅了,非法请求被挡在门外了,出 Bug 时开发人员定位更快了。飞机落地卸货时(返回响应),行李(响应数据)可能还会经过传送带,再补盖一个“已到达”的章(在响应返回客户端前,统一添加全局 Header)。本文将站在 Web 用户和管理员的视角,用最通俗的方式讲清楚什么是中间件、它有什么用,以及如何利用它让你的 Web 服务具备全局拦截、监控和加固的能力。

2026-07-06 22:37:27 78

原创 FastAPI 请求头与 Cookie:Web 世界的“身份证”与“通行证”

你无需手动解析原始请求字符串,只需在路由函数参数中声明你要读取的字段,框架就会自动提取、自动注入,让你用最少的代码,构建出最安全的身份识别系统。Cookie 的本质,就是服务器颁发给浏览器的一小段文本信息(通常不超过 4KB),浏览器将其保存在本地,并在之后的每一次请求中自动携带回服务器。本文将站在普通 Web 用户的视角,深入浅出地讲清楚请求头和 Cookie 到底是什么、有什么区别,以及 FastAPI 如何轻松读取它们,让你的后端服务具备识别用户、控制访问的能力。企业级应用中,请求头常用于链路追踪。

2026-07-06 22:34:12 133

原创 FastAPI 请求体:Web 表单背后的“数据包裹”

场景:电商下单时,订单包含 { "user": { "id": 1, "address": {...} }, "items": [{ "sku": "A1", "qty": 2 }] }。最关键的区别:路径参数和查询参数都在 URL 里(有长度限制,通常 2048 字符,且会留在浏览器历史中),而请求体在 HTTP 请求的“肚子”里(无大小硬上限,且 HTTPS 下是加密的)。你在任何 App 点“注册”,填写的用户名、密码、手机号通过 POST 请求的 Body 发送给后端,绝不暴露在 URL 里。

2026-07-06 22:28:17 190

原创 FastAPI 查询参数:Web 页面的“筛选开关”与“控制旋钮”

查询参数(Query Parameter):就像你在入口的查询机上点击筛选按钮:“我要 当季的、红色的、价格低于10元 的水果,并且 只看第一页”(/fruits?对于普通 Web 用户而言,查询参数就是你指尖在电商 App 上点击“筛选”、“排序”、“加载更多”时,浏览器悄悄在背后执行的“数字指令”。在后端,FastAPI 会自动帮你解码,无需担心。在 FastAPI 中,接收查询参数简单得令人发指:只要路由函数里的参数,既不在路径中(如 {id}),又不是请求体(Body),它就自动被识别为查询参数。

2026-07-06 22:24:44 313

原创 Pydantic 模型:为你的 Web 数据装上“安检系统”

当客户数据(请求体 / 查询参数)通过这个模具时,尺寸不对的会被撑大(类型转换,如 "123" 变成 123),标签缺失的会被打回(ValidationError),完全合规的才能流入仓库内部(业务逻辑)。例如,模型定义为 age: int,前端如果传 {"age": "18"}(字符串),Pydantic 会自动将字符串 "18" 转换为整数 18,而不是报错。本文将站在 Web 开发者的视角,用最通俗的方式解释 Pydantic 模型是什么、怎么用,以及它为什么能让你的 Web 应用固若金汤。

2026-07-06 22:20:47 389

原创 FastAPI 依赖注入:告别重复代码,让 Web 开发更优雅

在软件工程中,这种“一个对象为了完成任务,需要依赖其他组件”的关系,被称为依赖。你不再需要关注“怎么获取 Token 里的用户”,只需要在路由参数里写一句 user: User = Depends(get_current_user),框架就会在请求到达时自动装配好一切,并在响应发出后自动清理资源。每个接口都要重复处理分页参数?官方定义:依赖注入是一种设计模式,意味着代码所依赖的外部组件(如数据库客户端、认证服务、配置对象),不由代码自身去创建,而是由外部系统(FastAPI 框架)在运行时“注入”进来。

2026-07-06 22:16:41 295

原创 FastAPI 请求与响应:从数据接收到结果返回

通过 Pydantic 模型声明请求体、通过类型注解声明路径参数和查询参数、通过 response_model 规范输出、通过多种 Response 子类应对不同场景——FastAPI 将请求与响应的处理变成了一套声明式、类型安全、自动文档化的优雅体系。FastAPI 的请求与响应机制,本质上解决了一个 Web 框架最核心的问题:如何让开发者用最少的代码、最高的安全性,完成从 HTTP 请求到业务逻辑再到 HTTP 响应的全链路转换。Pydantic 提供了类型安全、自动验证和清晰的 API 文档。

2026-07-06 22:11:40 488

原创 FastAPI 基本路由:从入门到生产级应用

当访问 http://localhost:8000/products/456 时,又应该调用另一个函数。FastAPI 提供了 @app.get()、@app.post()、@app.put()、@app.delete() 等装饰器,分别对应不同的 HTTP 方法。当访问 http://localhost:8000/items/123 时,item_id 会自动绑定为 "123"。本文将从路由的基本概念讲起,逐步深入到模块化路由设计,最后探讨 FastAPI 在实际项目中的典型应用场景。

2026-07-06 22:05:27 507

原创 Pydantic 模型

所有前端 POST、PUT 提交的 JSON,全部用 Pydantic 约束: • 字段是不是必填 • 字符串长度、数字大小 • 邮箱、手机号、URL 格式是否正确 • 枚举限制(比如订单状态只能是 待支付 / 已完成 / 取消) • 类型强制转换(前端传字符串数字,自动转 int)Pydantic 就是 FastAPI 自带的自动校验工具,专门管「前端传给后端的数据」,自动检查格式、自动报错、自动规范返回内容,不用你手写一堆 if 判断。用途 2:规范后端「返回给前端」的数据(输出序列化)

2026-06-17 10:20:33 238

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除