news 2026/4/20 1:06:56

FastAPI零基础入门(纯知识点版)(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI零基础入门(纯知识点版)(附完整代码)

一、环境搭建

1. 创建虚拟环境

python -m venv venv

2. 激活虚拟环境

# Windows venv\Scripts\activate # Mac/Linux source venv/bin/activate

3. 安装包

pip install fastapi uvicorn

二、第一个程序

4. 创建main.py

from fastapi import FastAPI app = FastAPI() @app.get("/") def hello(): return {"message": "Hello World"}

5. 启动服务

uvicorn main:app --reload

6. 访问地址

  • 接口地址:http://localhost:8000

  • 自动文档:http://localhost:8000/docs

三、路径参数

7. 基本用法

@app.get("/user/{user_id}") def get_user(user_id: int): return {"user_id": user_id}

访问/user/123→ 返回{"user_id": 123}

8. 多个路径参数

@app.get("/user/{user_id}/item/{item_id}") def get_item(user_id: int, item_id: int): return {"user_id": user_id, "item_id": item_id}

四、查询参数

9. 基本用法

@app.get("/items") def get_items(page: int = 1, size: int = 10): return {"page": page, "size": size}

访问/items?page=3&size=20→ 返回{"page": 3, "size": 20}

10. 必填查询参数

from fastapi import Query @app.get("/search") def search(q: str = Query(...), limit: int = 10): return {"q": q, "limit": limit}

Query(...)中的...表示必填

五、请求体(POST)

11. 定义数据模型

from pydantic import BaseModel class User(BaseModel): name: str age: int email: str

12. 接收请求体

@app.post("/users") def create_user(user: User): return {"name": user.name, "age": user.age}

13. 可选字段

class User(BaseModel): name: str age: int = None # 或者 Optional[int] = None

六、响应模型

14. 限制返回字段

@app.post("/users", response_model=User) def create_user(user: User): return user

15. 返回列表

from typing import List @app.get("/users", response_model=List[User]) def get_users(): return [{"name": "张三", "age": 20}, {"name": "李四", "age": 22}]

七、HTTP状态码

16. 手动指定状态码

@app.post("/users", status_code=201) def create_user(user: User): return user

17. 返回错误

from fastapi import HTTPException @app.get("/user/{user_id}") def get_user(user_id: int): if user_id <= 0: raise HTTPException(status_code=400, detail="user_id必须大于0") return {"user_id": user_id}

常用状态码:

  • 200:成功

  • 201:创建成功

  • 400:请求参数错误

  • 404:找不到资源

  • 500:服务器错误

八、路径与查询参数混用

18. 同时使用

@app.get("/items/{item_id}") def get_item(item_id: int, q: str = None, page: int = 1): return {"item_id": item_id, "q": q, "page": page}

访问/items/123?q=hello&page=2

九、请求头

19. 获取请求头

from fastapi import Header @app.get("/headers") def get_headers(user_agent: str = Header(None), token: str = Header(None)): return {"user_agent": user_agent, "token": token}

十、异步支持

20. 异步写法

import asyncio @app.get("/async") async def async_endpoint(): await asyncio.sleep(1) return {"msg": "done"}

21. 什么时候用async

  • 函数里有await→ 用async def

  • 只有计算和数据处理 → 用def

十一、路径顺序

22. 固定路径写在动态路径前面

# 正确 @app.get("/users/me") def get_current_user(): return {"user": "me"} @app.get("/users/{user_id}") def get_user(user_id: int): return {"user_id": user_id} # 错误:/users/me 会被 /users/{user_id} 匹配

十二、完整示例

23. 简易待办事项接口

from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List app = FastAPI() class Todo(BaseModel): id: int title: str done: bool = False todos = [] @app.post("/todos", status_code=201, response_model=Todo) def create_todo(todo: Todo): for t in todos: if t.id == todo.id: raise HTTPException(status_code=400, detail="id已存在") todos.append(todo) return todo @app.get("/todos", response_model=List[Todo]) def list_todos(): return todos @app.get("/todos/{todo_id}") def get_todo(todo_id: int): for t in todos: if t.id == todo_id: return t raise HTTPException(status_code=404, detail="待办不存在") @app.delete("/todos/{todo_id}") def delete_todo(todo_id: int): for i, t in enumerate(todos): if t.id == todo_id: todos.pop(i) return {"msg": "删除成功"} raise HTTPException(status_code=404, detail="待办不存在")

十三、启动命令

24. 开发环境

uvicorn main:app --reload

25. 生产环境

uvicorn main:app --host 0.0.0.0 --port 8000

26. 生产环境(多进程)

pip install gunicorn gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

十四、常见错误

27. 端口被占用

  • 报错:Address already in use

  • 解决:换端口--port 8001或关掉占用端口的程序

28. 422 Unprocessable Entity

  • 原因:POST请求忘了加Content-Type: application/json

  • 解决:请求头加上这个

29. 路径顺序导致404

  • 原因:固定路径写在动态路径下面

  • 解决:把固定路径往上移

十五、常用命令速查

操作命令
激活虚拟环境(Windows)venv\Scripts\activate
激活虚拟环境(Mac/Linux)source venv/bin/activate
安装包pip install fastapi uvicorn
启动服务uvicorn main:app --reload
查看已装包pip list
退出虚拟环境deactivate
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 1:05:37

如何使用内联编辑修改数据_双击单元格快速更新法

原生HTML表格需手动绑定td的dblclick事件实现双击编辑&#xff0c;避免冒泡干扰&#xff1b;React中须用useEffect监听编辑态再聚焦&#xff0c;保存时防重复提交并比较新旧值&#xff0c;移动端应降级为点击编辑按钮。双击单元格触发编辑的 DOM 事件怎么监听原生 html 表格不支…

作者头像 李华
网站建设 2026/4/20 0:59:19

华为eNSP实战:跨VLAN场景下的DHCP中继配置详解

1. 跨VLAN通信与DHCP中继的核心价值 在企业网络环境中&#xff0c;VLAN技术就像给大楼划分不同楼层。想象一下&#xff0c;一栋写字楼里&#xff0c;10层是财务部&#xff0c;20层是市场部&#xff0c;两个部门需要物理隔离但又都要能访问公司的主服务器。这就是典型的跨VLAN通…

作者头像 李华
网站建设 2026/4/20 0:58:51

混沌工程:构建高可用系统的利器

混沌工程&#xff1a;构建高可用系统的利器 在数字化时代&#xff0c;系统的高可用性已成为企业核心竞争力的关键。随着系统架构的复杂化&#xff0c;传统的测试方法往往难以覆盖所有潜在故障场景。混沌工程应运而生&#xff0c;它通过主动注入故障来验证系统的韧性&#xff0…

作者头像 李华
网站建设 2026/4/20 0:56:53

别再只会用imshow了!Matlab图像显示从入门到进阶的5个实用技巧

别再只会用imshow了&#xff01;Matlab图像显示从入门到进阶的5个实用技巧 当你第一次在Matlab中键入imshow命令时&#xff0c;那种瞬间将数据矩阵转化为可视化图像的魔力令人着迷。但很快你会发现&#xff0c;科研论文中的精美图像和工程报告中的专业图表&#xff0c;远不是简…

作者头像 李华
网站建设 2026/4/20 0:53:57

别再只用PBKDF2了!聊聊国密标准GMT0091里的SM4和HMAC-SM3怎么用

国密算法实战&#xff1a;从PBKDF2到HMAC-SM3与SM4-CBC的迁移指南 金融级应用开发中&#xff0c;密钥派生与数据加密方案的选择直接影响系统安全性。当项目需要满足国密标准合规要求时&#xff0c;开发者常面临从国际通用算法向SM系列算法迁移的技术挑战。本文将手把手演示如何…

作者头像 李华