2026/4/15 5:47:52
网站建设
项目流程
寻找聊城做网站的公司,我想投资谁有项目,装修公司手机网站模板,建立网站买空间哪家好作者#xff1a;飞哥#xff08;一个喜欢讲故事的全栈开发者#xff0c;擅长把复杂的代码翻译成“人话”#xff09;
难度#xff1a;⭐⭐⭐
关键词#xff1a;FastAPI, Async, Pydantic, JWT, 鉴权大家好#xff0c;我是飞哥#xff01;#x1f44b;
在之前的课程里飞哥一个喜欢讲故事的全栈开发者擅长把复杂的代码翻译成“人话”难度⭐⭐⭐关键词FastAPI, Async, Pydantic, JWT, 鉴权大家好我是飞哥在之前的课程里我们写了很多 Python 脚本。脚本就像是在“自家厨房做饭”想吃什么随手拿做完自己吃很随意。但是我们要构建的 AI 应用比如一个公司内部的知识库助手是要给成百上千人用的。这时候脚本就不够用了。我们需要开一家“正规餐厅”Web 服务这里有服务员API 接口负责接待客人。菜单文档告诉客人有什么菜。保安鉴权防止有人吃霸王餐。FastAPI就是 Python 界开“餐厅”的神器。今天飞哥就带大家从零开始把我们的 RAG 脚本包装成一个高并发、安全的 API 服务 准备工作在开始之前我们需要安装几个“装修材料”pipinstallfastapiuvicorn[standard]pyjwt python-multipartfastapi: 核心框架。uvicorn: 高性能的服务器ASGI。pyjwt: 生成和校验 Token 的工具。python-multipart: 处理登录表单数据。第一步理解“异步” (Async/Await) ⚡️1. 为什么要异步Anchor Analogy大家去餐厅吃饭如果你点完菜服务员就一直站在桌边等你吃完收盘子才去招呼下一桌这餐厅肯定得倒闭。这叫同步 (Sync)效率极低。聪明的服务员是这样的帮你点完菜把单子给厨房耗时操作然后立刻去招呼下一桌客人。等厨房菜好了他再回来给你上菜。这就叫异步 (Async)。本质在等待 IO数据库查询、大模型生成的时候不傻等释放 CPU 去处理别的请求。2. 代码实战在 FastAPI 里只要加个async关键字你的接口就有了“超级服务员”的能力。importasynciofromfastapiimportFastAPIimportuvicorn appFastAPI()# 模拟一个耗时的 AI 生成任务asyncdeffake_ai_generation():awaitasyncio.sleep(2)# 模拟思考 2 秒 returnAI 思考完毕app.get(/chat)asyncdefchat():print(开始接待客人...)resultawaitfake_ai_generation()# 关键await 让出控制权print(客人接待完毕)return{message:result}if__name____main__:uvicorn.run(app,host127.0.0.1,port8000)一句话记住它async是服务员的工牌await是他在厨房窗口等待的那个动作。第二步严格的“保安” (Pydantic) ️1. 为什么要数据校验如果你的接口需要接收用户发来的 JSON 数据比如{query:你好,temperature:0.7}万一用户瞎发把temperature发成了字符串 “hot”或者忘了发query你的程序可能直接崩掉。我们需要一个“保安”在门口检查数据格式。如果不合格直接拦回去告诉他“格式不对”。这个保安就是Pydantic。2. 代码实战这是一个完整的可运行示例保存为pydantic_demo.py试试fromfastapiimportFastAPIfrompydanticimportBaseModelimportuvicorn appFastAPI()# 定义数据的“入场券”格式classChatRequest(BaseModel):query:strtemperature:float0.7# 默认值可以是小数history:list[str][]# 必须是字符串列表app.post(/api/v1/chat)asyncdefcreate_chat(request:ChatRequest):# 只要进到这里request.query 一定是 stringtemperature 一定是 float# 飞哥再也不用写 if type(x) ! str 这种代码了return{reply:f你问了{request.query}, 温度是{request.temperature}}if__name____main__:uvicorn.run(app,host127.0.0.1,port8000)运行后打开 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 appFastAPI()# --- 配置区 ---SECRET_KEYfeige_secret_key# ⚠️ 真实的密钥要藏好ALGORITHMHS256# 定义鉴权方案客户端要在 Header 里带 Authorization: Bearer tokenoauth2_schemeOAuth2PasswordBearer(tokenUrltoken)# --- 1. 登录接口发手环 ---app.post(/token)asyncdeflogin(form_data:OAuth2PasswordRequestFormDepends()):# 模拟查数据库ifform_data.username!feigeorform_data.password!123456:raiseHTTPException(status_code400,detail用户名或密码错误)# 生成 JWTtoken_data{sub:form_data.username,exp:datetime.utcnow()timedelta(minutes30)# 30分钟过期}tokenjwt.encode(token_data,SECRET_KEY,algorithmALGORITHM)return{access_token:token,token_type:bearer}# --- 2. 验证函数查手环 ---asyncdefget_current_user(token:strDepends(oauth2_scheme)):try:# 解码 Tokenpayloadjwt.decode(token,SECRET_KEY,algorithms[ALGORITHM])usernamepayload.get(sub)ifusernameisNone:raiseHTTPException(status_code401)returnusernameexceptjwt.PyJWTError:# 捕获 pyjwt 的错误raiseHTTPException(status_code401,detail手环无效或过期)# --- 3. 受保护的接口 ---app.get(/users/me)asyncdefread_users_me(username:strDepends(get_current_user)):return{username:username,status:VIP 贵宾}# --- 启动方式 ---# 方式 1: 在终端运行 uvicorn main:app --reload# 方式 2: 直接运行此脚本 python main.pyif__name____main__:importuvicorn uvicorn.run(app,host127.0.0.1,port8000)3. 如何测试(Swagger UI)FastAPI 自带一个超好用的文档页面运行代码uvicorn main:app --reload或python main.py浏览器打开http://127.0.0.1:8000/docs点击Authorize按钮输入用户名feige密码123456。登录成功后你的浏览器就戴上了“手环”可以随意测试/users/me接口了总结 今天我们完成了从“脚本小子”到“后端工程师”的蜕变FastAPI用async/await处理高并发像勤快的服务员。Pydantic用数据模型做严格校验像负责的保安。️JWT用 Token 机制管理用户状态像通用的 VIP 手环。 如果文章对你有帮助记得点赞、收藏哦关注飞哥下期见