欢迎光临
我们一直在努力

【Python全栈开发】第8讲 | Web 全栈之巅:FastAPI 高性能后端开发

1. 为什么是 FastAPI?

兄弟们,如果你还在学那些老掉牙的 Django 或者 Flask,那这一讲你得睁大眼睛了。

在现代全栈开发里,FastAPI 已经是很多大厂和初创公司的首选。为什么?

  • 快:它的运行速度可以和 NodeJS 或 Go 媲美,这在 Python 界简直是奇迹。
  • 骚:它利用 Python 的类型提示(Type Hints),能自动帮你生成接口文档、做数据校验。
  • 爽:写起来代码极少,而且原生支持 async/await 异步。
  • 今天,咱们就用 FastAPI 亲手撸一个生产级的 API 服务。


    2. 环境搭建:三行命令搞定

    首先,你得装两个东西:FastAPI 框架本身,和用来运行它的 Web 服务器 uvicorn。

    pip install fastapi uvicorn


    3. Hello World:五行代码跑起一个服务

    # main.py
    from fastapi import FastAPI

    app = FastAPI()

    @app.get("/")
    def read_root():
    return {"message": "你好,全栈之路!"}

    # 启动命令:uvicorn main:app –reload

    老司机解释:那个 –reload 是开发神器。你改完代码保存,服务器会自动重启,不需要你手动去关掉再开。


    4. Pydantic:你的“数据质检员”

    写 Web 服务最头疼的就是验证用户传过来的数据。万一该传数字的地方传了字符串,程序就崩了。 FastAPI 搭配 Pydantic,一行代码搞定验证:

    from pydantic import BaseModel

    # 定义一个“商品”的数据结构
    class Item(BaseModel):
    name: str
    price: float
    is_offer: bool | None = None

    @app.post("/items/")
    def create_item(item: Item):
    # 如果用户传的 price 不是数字,FastAPI 会自动返回 422 错误,根本不用你写 if
    return {"item_name": item.name, "total_price": item.price * 1.2}


    5. 路径参数 vs 查询参数

    • 路径参数:/items/42(指定 ID)。
    • 查询参数:/items/?skip=0&limit=10(翻页、搜索)。

    @app.get("/users/{user_id}")
    def read_user(user_id: int, q: str | None = None):
    # user_id 会自动转成整数,q 是可选的搜索关键词
    return {"user_id": user_id, "query": q}


    6. 自动化文档:FastAPI 的“杀手锏”

    兄弟们,如果你以前写 API,肯定被写 Swagger 文档折磨过。 在 FastAPI 里,你什么都不用做。服务跑起来后,直接访问:

    • http://127.0.0.1:8000/docs

    你会看到一个超级精美的交互式文档。你可以在上面直接点“Try it out”测试你的接口,再也不用开 Postman 了!


    7. 综合实战:构建一个待办事项 (To-Do) API

    咱们来个带增删改查(CRUD)功能的实战案例。

    from fastapi import FastAPI, HTTPException
    from pydantic import BaseModel

    app = FastAPI()

    # 模拟数据库
    todo_db = []

    class Todo(BaseModel):
    id: int
    title: str
    completed: bool = False

    @app.post("/todos/", status_code=201)
    def add_todo(todo: Todo):
    todo_db.append(todo)
    return {"message": "添加成功", "data": todo}

    @app.get("/todos/")
    def list_todos():
    return todo_db

    @app.get("/todos/{todo_id}")
    def get_todo(todo_id: int):
    for t in todo_db:
    if t.id == todo_id:
    return t
    raise HTTPException(status_code=404, detail="任务找不到了…")

    @app.delete("/todos/{todo_id}")
    def delete_todo(todo_id: int):
    global todo_db
    todo_db = [t for t in todo_db if t.id != todo_id]
    return {"message": "删除成功"}


    8. 💡 避坑小贴士(老司机的叮嘱)

  • async def 别乱用:如果你的函数里没有 await 任何东西(比如没去读文件、没去查数据库),直接写 def 往往更快。FastAPI 会在独立的线程池里跑它,不会阻塞。
  • 状态码很重要:成功了返回 200/201,找不到了返回 404,权限不够返回 401/403。别不管啥情况都返回 200,前端同学会想打人的。
  • 依赖注入 (Dependency Injection):当你以后要处理用户登录(Token 验证)时,去搜一下 FastAPI 的 Depends。它是这款框架的灵魂。

  • 8. 实战演练:巩固你的内功

    题目 1:查询参数与校验

    需求: 编写一个 API GET /search/,接收参数 keyword(必填,长度至少 2)和 limit(选填,默认 10,最大 50)。 使用 Query 进行参数校验。

    点击查看参考答案
    from fastapi import FastAPI, Query

    app = FastAPI()

    @app.get("/search/")
    def search(
    keyword: str = Query(..., min_length=2, description="搜索关键词"),
    limit: int = Query(10, le=50, description="返回结果数量")
    ):
    return {"keyword": keyword, "limit": limit, "results": ["模拟数据1", "模拟数据2"]}

    题目 2:依赖注入与 Token 验证

    需求: 编写一个依赖函数 verify_token,检查请求头 x-token 是否为 “fake-super-secret-token”。 如果是,允许访问;否则抛出 400 错误。 将此依赖应用到 GET /protected/ 路由上。

    点击查看参考答案
    from fastapi import FastAPI, Header, HTTPException, Depends

    app = FastAPI()

    def verify_token(x_token: str = Header(...)):
    if x_token != "fake-super-secret-token":
    raise HTTPException(status_code=400, detail="Token 无效")
    return x_token

    @app.get("/protected/")
    def protected_route(token: str = Depends(verify_token)):
    return {"message": "验证通过", "token": token}

    题目 3:文件上传

    需求: 编写一个 API POST /upload/,接收一个文件上传。 返回文件的文件名和文件大小。 提示:需要安装 python-multipart。

    点击查看参考答案
    from fastapi import FastAPI, UploadFile, File

    app = FastAPI()

    @app.post("/upload/")
    async def upload_file(file: UploadFile = File(...)):
    # file.filename 是文件名
    # await file.read() 读取内容
    content = await file.read()
    return {
    "filename": file.filename,
    "content_type": file.content_type,
    "size": len(content)
    }


    9. 系列索引

    • 上一篇:第7讲 | 数据库集成:让你的数据在 MySQL 与 Redis 中安家
    • 下一篇:第9讲 | 工程化实战:测试、Git 与生产级部署

    写在最后: 这一讲学完,你已经能够把你的 Python 逻辑变成全世界都能访问的服务了。 Web 开发的水很深,安全、高并发、缓存、部署都是大课。咱们先把 API 跑起来,以后再慢慢优化。 别只是看,去电脑上运行那个 To-Do API,打开 /docs 玩一下。 觉得有收获的话,点赞、收藏!咱们下一讲聊聊怎么让你的代码达到生产级别——工程化实战!

    赞(0)
    未经允许不得转载:171主机测评 » 【Python全栈开发】第8讲 | Web 全栈之巅:FastAPI 高性能后端开发
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址