title: FastAPI路由与请求处理全解:手把手打造用户管理系统

date: 2025/3/2

updated: 2025/3/2

author: cmdragon

excerpt:

通过咖啡店点单系统的生动案例,零基础掌握FastAPI路由核心机制。你将:
用真实场景理解@app.get/@app.post等6种HTTP方法装饰器
通过用户管理API实现完整CRUD操作
学习路径参数与查询参数的进阶玩法
获得防误操作锦囊(含参数校验/SQL注入防御方案)

categories:

  • 后端开发
  • FastAPI

tags:

  • FastAPI路由实战
  • HTTP方法详解
  • 路径参数技巧
  • 查询参数进阶
  • 用户管理API
  • 请求处理陷阱
  • 新手友好教程



扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

探索数千个预构建的 AI 应用,开启你的下一个伟大创意

通过咖啡店点单系统的生动案例,零基础掌握FastAPI路由核心机制。你将:

  • 用真实场景理解@app.get/@app.post6种HTTP方法装饰器
  • 通过用户管理API实现完整CRUD操作
  • 学习路径参数查询参数的进阶玩法
  • 获得防误操作锦囊(含参数校验/SQL注入防御方案)

第一章:路由就像咖啡店电话转接

1.1 基础路由结构

from fastapi import FastAPI

app = FastAPI()

# 简单GET路由
@app.get("/menu")
async def get_menu():
return {"饮品": ["美式", "拿铁", "卡布奇诺"]} # 带路径参数的GET路由
@app.get("/orders/{order_id}")
async def get_order(order_id: int):
return {"订单号": order_id, "状态": "制作中"}

1.2 HTTP方法对照表

方法 咖啡店比喻 FastAPI装饰器
GET 查看菜单 @app.get
POST 下单新订单 @app.post
PUT 修改订单 @app.put
DELETE 取消订单 app.delete

第二章:用户管理API实战

2.1 完整CRUD实现

from typing import List
from pydantic import BaseModel class User(BaseModel):
id: int
name: str
email: str fake_db: List[User] = [] # 创建用户
@app.post("/users")
async def create_user(user: User):
fake_db.append(user)
return {"操作": "创建成功", "数据": user} # 获取所有用户
@app.get("/users")
async def get_users():
return fake_db # 更新用户
@app.put("/users/{user_id}")
async def update_user(user_id: int, new_user: User):
for index, user in enumerate(fake_db):
if user.id == user_id:
fake_db[index] = new_user
return {"操作": "更新成功"}
return {"错误": "用户不存在"} # 删除用户
@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
global fake_db
fake_db = [user for user in fake_db if user.id != user_id]
return {"操作": "删除成功"}

2.2 Swagger UI自动文档

访问 http://localhost:8000/docs 查看效果:


第三章:参数处理黑科技

3.1 路径参数 vs 查询参数

# 路径参数
@app.get("/products/{category}")
async def get_by_category(category: str):
... # 查询参数
@app.get("/search")
async def search_products(keyword: str, limit: int = 10):
...

3.2 参数校验技巧

from fastapi import Query

@app.get("/users")
async def filter_users(
age: int = Query(..., ge=18, description="最小年龄"),
is_vip: bool = Query(False)
):
return [u for u in fake_db if u.age >= age and u.is_vip == is_vip]

第四章:课后安全实验室

任务1:修复SQL注入漏洞

# 危险代码
@app.get("/user/{name}")
async def get_user(name: str):
query = f"SELECT * FROM users WHERE name = '{name}'" # 你的任务:使用参数化查询改写

任务2:添加分页功能

@app.get("/users")
async def get_users(
page: int = Query(1, ge=1),
size: int = Query(10, le=100)
):
# 实现分页逻辑
start = (page - 1) * size
return fake_db[start:start + size]

常见错误诊疗室

错误现象 原因 解决方案
422 Validation Error 参数类型不匹配 检查路径参数是否为int/查询参数是否必填
405 Method Not Allowed 使用错误的HTTP方法 确认路由装饰器与方法匹配
路由冲突 多个路由相同路径 确保路径+方法组合唯一

结语

现在运行 uvicorn main:app --reload 启动你的用户管理API吧!遇到问题随时查阅附带的路由调试检查清单,编码愉快!


余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:FastAPI路由与请求处理全解:手把手打造用户管理系统 | cmdragon's Blog

往期文章归档:

FastAPI路由与请求处理全解:手把手打造用户管理系统 🔌的更多相关文章

  1. TCP协议要点和难点全解

    转载自http://www.cnblogs.com/leetieniu2014/p/5771324.html TCP协议要点和难点全解 说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方 ...

  2. Mybatis系列全解(六):Mybatis最硬核的API你知道几个?

    封面:洛小汐 作者:潘潘 2020 年的大疫情,把世界撕成几片. 时至今日,依旧人心惶惶. 很庆幸,身处这安稳国, 兼得一份安稳工. · 东家常讲的一个词:深秋心态 . 大势时,不跟风.起哄, 萧条时 ...

  3. redis全解

    Redis全解 1.什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到 ...

  4. 易全解token获取

    //易全解app             string strClientID = "2016061711434943493606";             string str ...

  5. IOS-UITextField-全解

    IOS-UITextField-全解   //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame: ...

  6. 什么是JavaScript闭包终极全解之一——基础概念

    本文转自:http://www.cnblogs.com/richaaaard/p/4755021.html 什么是JavaScript闭包终极全解之一——基础概念 “闭包是JavaScript的一大谜 ...

  7. Sql Server函数全解<五>之系统函数

    原文:Sql Server函数全解<五>之系统函数  系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些 ...

  8. Sql Server函数全解<四>日期和时间函数

    原文:Sql Server函数全解<四>日期和时间函数   日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外, ...

  9. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  10. js系列教程2-对象、构造函数、对象属性全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

随机推荐

  1. nodejs koa2 ocr识别 身份证信息

    1. 安装依赖 npm install baidu-aip-sdk 2.创建AipOcrClient 注:需要到百度api创建应用,拿到所需的APPID/AK/SK https://console.b ...

  2. P6474 [NOI Online #2 入门组] 荆轲刺秦王 题解

    荆轲将会臭名昭著 首先 $15$ 做法很简单,那就是直接 `cout<<-1` 考虑用 BFS 来解思路很简单,但是怎么求每个士兵的控制范围呢? 直接暴力时间复杂度是 $O(nma^2)$ ...

  3. Shiro安全框架【认证】+【授权】

    1.Shiro的核心架构 Subject:程序主体 Security Manager:安全管理器 Authentication:做认证 Authorizer:做授权 Session Manager:会 ...

  4. Docker安装FISCO BCOS区块链平台

    2.0版本提供docker镜像,支持容器化部署,省去了很多编译安装过程遇到的各种问题. FISCO BCOS官方镜像docker地址:https://hub.docker.com/r/fiscoorg ...

  5. 龙哥量化:期货交易软件:文华、博易大师闪电手、快期,同花顺期货通,金字塔,MC,MT5,TB交易开拓者横向对比分析

    如果您需要代写公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 此文档做对比分析, 我有空后给详细分析

  6. Qt编写地图综合应用57-跨平台(win、linux、mac、uos、kylin等)

    一.前言 跨平台着实花了不少的精力,为了从Qt4.7兼容到Qt6.2及后续版本,头发掉了不少,仅有的几根毛所剩无几,哎,可能这就是程序员的命,本人写Qt程序这么多年,比较喜欢支持多个Qt版本,尤其是钟 ...

  7. Qt编写的项目作品13-机房安全作业预警系统

    一.功能特点 显示维修间所有图像: 门外1号红外,门内2号红外: 1号先报警,紧接2号报警,人员进入计时: 图标显示:人员图标和报警等级图标,人员进入了,人员图标闪烁,等级图标对应不同时间: 功能要求 ...

  8. C++书籍推荐

    本人收藏的一些电子版: 阅读顺序 C++ primer 基础 Professional C++ 基础+新特性 现代C++语言核心特性解析 更多新特性,STL并发库介绍 C++ Templates 更多 ...

  9. 浅说c/c++ coroutine

    浅说c/c++ coroutine 从上面我们可以得到关于协程的几个关键信息, 1.打破传统(regular)函数调用的限制. 2.stackful协程实现方式,基于独立栈,上下文切换. 3.stac ...

  10. 优化永不止步:TinyVue v3.20.0 正式发布,更美观的官网UI,更友好的文档搜索,更强大的主题配置能力~

    你好,我是 Kagol,个人公众号:前端开源星球. 我们非常高兴地宣布,2024年12月4日,TinyVue 发布了 v3.20.0 . 本次 3.20.0 版本主要有以下重大变更: OpenTiny ...