FastAPI零基础入门(纯知识点版)(附完整代码)
一、环境搭建1. 创建虚拟环境python -m venv venv2. 激活虚拟环境# Windows venv\Scripts\activate # Mac/Linux source venv/bin/activate3. 安装包pip install fastapi uvicorn二、第一个程序4. 创建main.pyfrom fastapi import FastAPI app FastAPI() app.get(/) def hello(): return {message: Hello World}5. 启动服务uvicorn main:app --reload6. 访问地址接口地址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?page3size20→ 返回{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(...)中的...表示必填五、请求体POST11. 定义数据模型from pydantic import BaseModel class User(BaseModel): name: str age: int email: str12. 接收请求体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_modelUser) def create_user(user: User): return user15. 返回列表from typing import List app.get(/users, response_modelList[User]) def get_users(): return [{name: 张三, age: 20}, {name: 李四, age: 22}]七、HTTP状态码16. 手动指定状态码app.post(/users, status_code201) def create_user(user: User): return user17. 返回错误from fastapi import HTTPException app.get(/user/{user_id}) def get_user(user_id: int): if user_id 0: raise HTTPException(status_code400, detailuser_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?qhellopage2九、请求头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_code201, response_modelTodo) def create_todo(todo: Todo): for t in todos: if t.id todo.id: raise HTTPException(status_code400, detailid已存在) todos.append(todo) return todo app.get(/todos, response_modelList[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_code404, 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_code404, detail待办不存在)十三、启动命令24. 开发环境uvicorn main:app --reload25. 生产环境uvicorn main:app --host 0.0.0.0 --port 800026. 生产环境多进程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