AI后端工程化:FastAPI + Pydantic + JWT 鉴权实战,从零构建 AI 接口服务

作者:飞哥(一个喜欢讲故事的全栈开发者,擅长把复杂的代码翻译成“人话”)
难度:⭐⭐⭐
关键词:FastAPI, Async, Pydantic, JWT, 鉴权

大家好,我是飞哥!👋

在之前的课程里,我们写了很多 Python 脚本。脚本就像是在“自家厨房做饭”🍳,想吃什么随手拿,做完自己吃,很随意。

但是,我们要构建的 AI 应用(比如一个公司内部的知识库助手),是要给成百上千人用的。这时候,脚本就不够用了。我们需要开一家“正规餐厅”🏪(Web 服务),这里有:

  • 服务员(API 接口):负责接待客人。
  • 菜单(文档):告诉客人有什么菜。
  • 保安(鉴权):防止有人吃霸王餐。

FastAPI就是 Python 界开“餐厅”的神器。今天飞哥就带大家从零开始,把我们的 RAG 脚本包装成一个高并发、安全的 API 服务!🚀


📦 准备工作

在开始之前,我们需要安装几个“装修材料”:

pipinstallfastapi"uvicorn[standard]"pyjwt python-multipart
  • fastapi: 核心框架。
  • uvicorn: 高性能的服务器(ASGI)。
  • pyjwt: 生成和校验 Token 的工具。
  • python-multipart: 处理登录表单数据。

第一步:理解“异步” (Async/Await) ⚡️

1. 为什么要异步?(Anchor & Analogy)

大家去餐厅吃饭,如果你点完菜,服务员就一直站在桌边等你吃完收盘子,才去招呼下一桌,这餐厅肯定得倒闭。这叫同步 (Sync),效率极低。😫

聪明的服务员是这样的:帮你点完菜,把单子给厨房(耗时操作),然后立刻去招呼下一桌客人。等厨房菜好了,他再回来给你上菜。这就叫异步 (Async)。🏃

本质:在等待 IO(数据库查询、大模型生成)的时候,不傻等,释放 CPU 去处理别的请求。

2. 代码实战

在 FastAPI 里,只要加个async关键字,你的接口就有了“超级服务员”的能力。

importasynciofromfastapiimportFastAPIimportuvicorn app=FastAPI()# 模拟一个耗时的 AI 生成任务asyncdeffake_ai_generation():awaitasyncio.sleep(2)# 模拟思考 2 秒 💤return"AI 思考完毕!"@app.get("/chat")asyncdefchat():print("开始接待客人...")result=awaitfake_ai_generation()# 关键:await 让出控制权print("客人接待完毕!")return{"message":result}if__name__=="__main__":uvicorn.run(app,host="127.0.0.1",port=8000)

一句话记住它async是服务员的工牌,await是他在厨房窗口等待的那个动作。


第二步:严格的“保安” (Pydantic) 🛡️

1. 为什么要数据校验?

如果你的接口需要接收用户发来的 JSON 数据,比如:

{"query":"你好","temperature":0.7}

万一用户瞎发,把temperature发成了字符串 “hot”,或者忘了发query,你的程序可能直接崩掉。💥

我们需要一个“保安”,在门口检查数据格式。如果不合格,直接拦回去,告诉他“格式不对”。这个保安就是Pydantic

2. 代码实战

这是一个完整的可运行示例,保存为pydantic_demo.py试试:

fromfastapiimportFastAPIfrompydanticimportBaseModelimportuvicorn app=FastAPI()# 定义数据的“入场券”格式classChatRequest(BaseModel):query:strtemperature:float=0.7# 默认值,可以是小数history:list[str]=[]# 必须是字符串列表@app.post("/api/v1/chat")asyncdefcreate_chat(request:ChatRequest):# 只要进到这里,request.query 一定是 string,temperature 一定是 float# 飞哥再也不用写 if type(x) != str 这种代码了!😂return{"reply":f"你问了:{request.query}, 温度是:{request.temperature}"}if__name__=="__main__":uvicorn.run(app,host="127.0.0.1",port=8000)

运行后,打开 Swagger UI (http://127.0.0.1:8000/docs),找到 POST 接口,点击 Try it out,你可以故意传个错的数据(比如把 temperature 改成 “hot”),看看保安会不会拦你。🚫


第三步:只有 VIP 能进 (JWT 鉴权) 🎫

1. 什么是 JWT?

现在我们要给 API 加锁,只有登录用户才能用。🔐

HTTP 是“健忘”的,服务器记不住谁是谁。所以,用户登录成功后,我们发给他一张“电子手环” (JWT Token)。
以后他每次来请求,只要亮一下手环,我们就知道他是谁,不用反复查身份证(数据库)。

JWT (JSON Web Token)的本质就是一段加密的字符串,里面藏着用户的 ID 和过期时间。

2. 代码实战:完整可运行代码 (main.py)

请创建一个main.py文件,复制以下所有代码:

fromfastapiimportFastAPI,Depends,HTTPExceptionfromfastapi.securityimportOAuth2PasswordBearer,OAuth2PasswordRequestFormfrompydanticimportBaseModelimportjwtfromdatetimeimportdatetime,timedelta app=FastAPI()# --- 配置区 ---SECRET_KEY="feige_secret_key"# ⚠️ 真实的密钥要藏好ALGORITHM="HS256"# 定义鉴权方案:客户端要在 Header 里带 Authorization: Bearer <token>oauth2_scheme=OAuth2PasswordBearer(tokenUrl="token")# --- 1. 登录接口:发手环 ---@app.post("/token")asyncdeflogin(form_data:OAuth2PasswordRequestForm=Depends()):# 模拟查数据库ifform_data.username!="feige"orform_data.password!="123456":raiseHTTPException(status_code=400,detail="用户名或密码错误")# 生成 JWTtoken_data={"sub":form_data.username,"exp":datetime.utcnow()+timedelta(minutes=30)# 30分钟过期}token=jwt.encode(token_data,SECRET_KEY,algorithm=ALGORITHM)return{"access_token":token,"token_type":"bearer"}# --- 2. 验证函数:查手环 ---asyncdefget_current_user(token:str=Depends(oauth2_scheme)):try:# 解码 Tokenpayload=jwt.decode(token,SECRET_KEY,algorithms=[ALGORITHM])username=payload.get("sub")ifusernameisNone:raiseHTTPException(status_code=401)returnusernameexceptjwt.PyJWTError:# 捕获 pyjwt 的错误raiseHTTPException(status_code=401,detail="手环无效或过期")# --- 3. 受保护的接口 ---@app.get("/users/me")asyncdefread_users_me(username:str=Depends(get_current_user)):return{"username":username,"status":"VIP 贵宾"}# --- 启动方式 ---# 方式 1: 在终端运行 uvicorn main:app --reload# 方式 2: 直接运行此脚本 python main.pyif__name__=="__main__":importuvicorn uvicorn.run(app,host="127.0.0.1",port=8000)

3. 如何测试?(Swagger UI)

FastAPI 自带一个超好用的文档页面!🎉

  1. 运行代码:uvicorn main:app --reloadpython main.py
  2. 浏览器打开:http://127.0.0.1:8000/docs
  3. 点击Authorize按钮,输入用户名feige密码123456
  4. 登录成功后,你的浏览器就戴上了“手环”,可以随意测试/users/me接口了!

总结 📚

今天我们完成了从“脚本小子”到“后端工程师”的蜕变:

  1. FastAPI:用async/await处理高并发,像勤快的服务员。🏃
  2. Pydantic:用数据模型做严格校验,像负责的保安。🛡️
  3. JWT:用 Token 机制管理用户状态,像通用的 VIP 手环。🎫

📢 如果文章对你有帮助,记得点赞、收藏哦!关注飞哥,下期见!👋

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

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

相关文章

短视频缺音效?2026年免费音效素材网站推荐榜单 自媒体/影视后期/游戏

一、引言&#xff1a;免费音效素材需求激增&#xff0c;品质与版权成关键痛点据中国音像与数字出版协会2025年《数字音效素材行业发展报告》显示&#xff0c;国内自媒体创作、影视后期制作、游戏开发等领域对免费音效素材的年需求量达48亿次&#xff0c;较上年增长51%。但行业调…

比如我现在左转没看到门左走,然后右转也没看到门后退,结果过了门了,最后一步奖励100,训练的时候会怎么修改神经网络 gru+ppo,还有离门就差一步结果跑出去绕了5步最后奖励20

我来详细解释一下在GRUPPO算法中&#xff0c;神经网络是如何根据这些情况进行训练和更新的。 PPO训练过程中的神经网络更新机制 1. 奖励信号传播 # 在 [GRUPPOAgent.update](file:///e%3A/code/my_python_server/sifu_control/ppo_networks.py#L576-714) 方法中&#xff1a;# 计…

扫描线算法

一.简介扫描线算法&#xff08;Sweep Line Algorithm&#xff09;是一种用于高效解决几何问题&#xff08;尤其是设计区间&#xff0c;矩形&#xff0c;线段等&#xff09;的经典算法思想。扫描线算法的核心思想是&#xff1a;用一条假象的线在平面上扫过整个图形&#xff0c;将…

ue5 设置分辨率笔记

3种方法&#xff1a; https://blog.csdn.net/weixin_52555766/article/details/134695226 测试没起作用。

[原创]基于CCO-ELM多输出回归+SHAP可解释性分析 Matlab代码(多输入多输出)

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 (CCO-ELMSHAP)基于杜鹃鲶鱼算法优化极限学习机的数据多输入多输出SHAP可解释性分析的回归预测模型 1、在机器学习和深度学习领域&#xff0c;模型复杂度的不断攀升使得决策过程的可解释性成为研究热点。模型…

11. 命令缓冲区和DMA

1.命令缓冲区和DMA1.命令缓冲区和DMA 两者是"协作关系" —— CPU先把"数据上传指令"写入命令缓冲区, GPU执行指令时, 底层通过DMA完成实际的数据拷贝a.命令缓冲区- 本质: CPU写给GPU的"指令清单"(内存块)- 类比: 你填的"快递单"(写清楚…

【Java】万字解读Java的动态代理(JDK原生动态代理、CGLIB动态代理)_java 动态代理,零基础入门到精通,收藏这篇就够了

1. 前言 动态代理在Java中有着广泛的应用&#xff0c;比如 Spring AOP、RPC 远程调用、Java 注解对象获取、日志、用户鉴权、全局性异常处理、性能监控&#xff0c;甚至事务处理等。 下面我将着重的介绍两个常用的动态代理&#xff1a;JDK原生动态代理 和 CGLIB 动态代理。 …

[原创]基于CCO-LSSVM多输出回归+SHAP可解释性分析 Matlab代码(多输入多输出)

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 (CCO-LSSVMSHAP)基于杜鹃鲶鱼算法优化最小二乘向量机的数据多输入多输出SHAP可解释性分析的回归预测模型 1、在机器学习和深度学习领域&#xff0c;模型复杂度的不断攀升使得决策过程的可解释性成为研究热点…

12. CPU → GPU数据上传 + 渲染指令执行流程

1.CPU → GPU数据上传 渲染指令执行流程 2.绑定GPU显存中的VBO/IBO说明1.CPU → GPU数据上传 渲染指令执行流程 以渲染一个3D对象为例, 全流程如下1).CPU准备阶段a.CPU在内存中整理好顶点数据、索引数据、常量缓冲区参数(比如 MVP 矩阵)b.CPU确定本次渲染的渲染状态(深度测试…

java中反射机制的应用场景,零基础入门到精通,收藏这篇就够了

1. 动态代理 动态代理是Java反射机制的一个重要应用场景。通过动态代理&#xff0c;可以在运行时创建代理类并处理方法调用。动态代理在Java中的主要应用场景是AOP&#xff08;面向切面编程&#xff09;&#xff0c;如事务管理、日志记录、权限控制等。 示例&#xff1a; im…

django基于python的秦宇宙智慧游乐场游乐园门票售票系统网站的设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着信息技术的快速发展&#xff0c;智慧化管理系统在游乐园行业的应用日益广泛。本文设计并实现了一个基于Python和D…

Java 开发转前端:利用 AI 竟然如此简单_java 对象生成前端文档,零基础入门到精通,收藏这篇就够了

&#x1f525;关注墨瑾轩&#xff0c;带你探索编程的奥秘&#xff01;&#x1f680; &#x1f525;超萌技术攻略&#xff0c;轻松晋级编程高手&#x1f680; &#x1f525;技术宝库已备好&#xff0c;就等你来挖掘&#x1f680; &#x1f525;订阅墨瑾轩&#xff0c;智趣学习不…

[原创]基于ELM多输出回归+SHAP可解释性分析+NSGAII多目标优化算法的工艺参数优化 Matlab代码

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 (ELMSHAP)基于ELM极限学习机的数据多输入多输出SHAP可解释性分析的回归预测模型 SHAP部分&#xff1a; 1、在机器学习和深度学习领域&#xff0c;模型复杂度的不断攀升使得决策过程的可解释性成为研究热点…

django基于python的社区老年人关爱服务系统的设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着人口老龄化加剧&#xff0c;社区老年人关爱服务需求日益增长。传统服务模式存在效率低、资源分配不均等问题&…

基于Springboot+Vue的大学生军训系统设计与实现

前言 &#x1f31e;博主介绍&#xff1a;✌CSDN特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发、文档编写、答疑辅导等。✌…

django基于python的美食探店分享网站设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着移动互联网的普及&#xff0c;美食探店分享平台逐渐成为用户获取餐饮信息的重要渠道。基于Python的Django框架设计…

[原创]基于CCO-ELM多输出回归+SHAP可解释性分析+NSGAII多目标优化算法的工艺参数优化 Matlab代码

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 (CCO-ELM+SHAP)基于杜鹃鲶鱼算法优化极限学习机的数据多输入多输出+SHAP可解释性分析的回归预测模型 SHAP部分: 1、在机器学习和深度学习领域,模型复杂度的不断攀升使得决策过程的可解释性成为研究热点。…

[原创基于CCO-LSSVM多输出回归+SHAP可解释性分析+NSGAII多目标优化算法的工艺参数优化 Matlab代码

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 (CCO-LSSVM+SHAP)基于杜鹃鲶鱼算法优化最小二乘向量机的数据多输入多输出+SHAP可解释性分析的回归预测模型 SHAP部分: 1、在机器学习和深度学习领域,模型复杂度的不断攀升使得决策过程的可解释性成为研究…

django基于python的酒店预定管理系统 客房清洁

目录 Django酒店预订管理系统中的客房清洁模块设计 关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; Django酒店预订管理系统中的客房清洁模块设计 Django框架构建的酒店预订管理系…

tinylisp:只有99行c代码的lisp语言

源码&#xff1a;Robert-van-Engelen/tinylisp: Lisp in 99 lines of C and how to write one yourself. Includes 21 Lisp primitives, garbage collection and REPL. Includes tail-call optimized versions for speed and reduced memory use. 用99行C代码实现Lisp及自制教…