FastAPI

目录

1fastapi是什么,优点以及有哪些知识要学?

2fastapi基本代码

3怎么运行fastapi及访问交互式文档?

4路由是什么?

5请求参数有什么分类?

6路径参数怎么进行类型注解及代码体现?

7什么是查询参数及形式?

8Path()和Query()有什么区别?

9什么是请求体参数?

10响应类型有哪些及设置方式?

11异常怎么处理及编码?

12中间件是什么以及作用以及执行顺序?

13依赖注入是什么?何时用中间件何时用依赖注入?

14什么是ORM及使用流程?

15AI崛金头条新闻系统

16怎么算跨域/同源?

17获取新闻列表功能怎么实现的?

18获取新闻详情怎么实现的?

19用户模块

20密码加密

21什么是db.refresh()?

22封装通用成功响应格式

23模型类配置的两条有什么用?

24全局异常处理器

25用户登录

26获取用户信息

27修改用户信息

28修改用户密码

29fastapi都有什么以及使用什么进行转换(orm,pydantic,字典)

30Depends有什么用?

31收藏模块:检查新闻收藏状态

32添加收藏

33取消收藏

34获取收藏列表

35清空收藏列表

36浏览历史模块

37添加浏览记录

38获取浏览历史列表

39删除单条浏览记录

40清空浏览历史列表

41缓存和模型调用

42缓存新闻列表

[43AI问答功能(调用大模型 )](#43AI问答功能(调用大模型 ))

44总结


1fastapi是什么,优点以及有哪些知识要学?

是一个基于python的高性能的web框架,专门用于快速构建api的接口服务

优点 异步性能高 /开发效率高 /自动生成文档

2fastapi基本代码

意from import从fastapi库导入FastAPI模块,注意创建实例(app=FastAPI()),要不然每次都是新的实例

3怎么运行fastapi及访问交互式文档?

4路由是什么?

5请求参数有什么分类?

6路径参数怎么进行类型注解及代码体现?

**...**表示不能为空

7什么是查询参数及形式?

8Path()和Query()有什么区别?

9什么是请求体参数?

10响应类型有哪些及设置方式?

python 复制代码
from fastapi.responses import FileResponse      # 文件响应(图片、PDF等)
from fastapi.responses import JSONResponse      # JSON 响应(自定义状态码等)
from fastapi.responses import HTMLResponse      # HTML 响应
from fastapi.responses import PlainTextResponse # 纯文本响应
from fastapi.responses import RedirectResponse  # 重定向响应
from fastapi.responses import StreamingResponse # 流式响应(大文件、视频流)

11异常怎么处理及编码?

12中间件是什么以及作用以及执行顺序?

问:await有什么用?放异步执行的代码(它是为了处理异步操作,)

这里面的call_next()是什么?

是中间件中的一个固定参数,作用是把请求传递给下一个处理环节。

13依赖注入是什么?何时用中间件何时用依赖注入?

为什么要使用depends,我直接调用这个类或函数不可以吗?

为什么不需要传参

14什么是ORM及使用流程?

Mappeddatetime = mapped_column() 这个是什么意思?

  • Mapped[datetime]Python 侧的类型标记,管代码提示。
  • mapped_column(...)数据库字段定义,管建表、SQL 规则。

ORM:对象关系映射,简单说:类 = 数据库表,类的属性 = 表里字段,实例对象 = 表里面一行数据

解释这个 on_event

我不懂里面这个 with?

with / async with:资源自动管理工具。进入代码块申请资源,离开代码块自动释放资源,异常也能安全处理。

.begin()有什么用?

.begin()开启一个事务,同时获取数据库连接

async_engine.connect() 的区别(非常容易混淆)

  • async_engine.begin():拿到连接,自动开启事务,离开块自动 commit/rollback(适合一次性执行,比如建表)
  • async_engine.connect():只是拿到连接,不会自动开启事务 ,需要你手动写 await conn.begin()、手动 commit,适合多次分步操作。

这行什么意思?

这里面的yield 以及raise我不明白是什么意思?

yield:暂停函数,把 session 交给路由;路由执行完,回来执行后面清理代码。FastAPI 依赖注入专用。

raise:捕获异常回滚数据库之后,重新抛出异常,不让错误被悄悄吃掉,交给框架返回错误。

AsyncSission 呢是什么意思?

AsyncSession 就是异步版的数据库会话对象 ,用来和数据库交互,执行增删改查 SQL,对应同步版本的 Session

会话 = 和数据库的一次连接对话 就像你打开 Navicat,连上数据库,然后执行多条 SQL。这个 "连接对话" 就是 Session。

流程:导包->创建异步引擎->创建会话工厂->创建依赖项->使用

这个 in 是必须跟上下划线吗?

Python 关键字冲突 → SQLAlchemy 方法末尾加下划线

  • in → in_
  • is → is_

为什么有时候sclar 加s有时候不加?

  • scalar() 👉 不加 s:只拿单个值(一行一列,聚合函数 count/avg/max/sum 就用它)
  • scalars() 👉 加 s:取出多条 ORM 对象(多行,普通查询查多条记录用)

不理解 Book () 那里?

15AI崛金头条新闻系统

16怎么算跨域/同源?

17获取新闻列表功能怎么实现的?

问题:alias作用?

alias:查询参数别名 FastAPI 里,函数内部变量名 和 URL 传参的名字 可以不一样,alias用来指定URL 上的参数名

18获取新闻详情怎么实现的?

为什么这里要再写一遍commit(),不是在依赖项里面写了吗?

主要是怕没法实时更新数据库让其他的路由看到最新消息,其实这样写会造成冗余

怎么让相关推荐也能显示关键信息?

使用列表推导式

19用户模块

20密码加密

21什么是db.refresh()?

22封装通用成功响应格式

23模型类配置的两条有什么用?

.model_validate(user)有什么用?

24全局异常处理器

问题:全局异常处理器怎么捕获异常的?

当接口路由里面抛出指定类型异常没有在路由内部 try-except 捕获时,FastAPI 会自动把异常交给你提前注册好的全局处理函数,统一返回固定格式 JSON。

25用户登录

26获取用户信息

python 复制代码
# 整合 根据 token 查询用户,返回用户
from fastapi import Header, Depends, HTTPException
from fastapi import status
from sqlalchemy.ext.asyncio import AsyncSession

from config.db_config import get_db
from crud import users

async def get_current_user(authorization: str = Header(...), db: AsyncSession = Depends(get_db)):
    token = authorization
    user = await users.get_user_by_token(db, token)
    if not user:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效或已过期的令牌")

    return user

这个里面的header是什么?

Header 是 FastAPI 提供的依赖项工具 ,作用:从 HTTP 请求头(Request Header)里面提取参数

问题:怎么依赖注入?

使用from improt导入具体的方法名字,然后使用的时候使用Depends即可

27修改用户信息

什么是 pydantic 类型?

怎么将pydantic类型转换以及设置将没有设置值(传参的数据)不更新

28修改用户密码

python 复制代码
# 修改密码
async def update_password(db: AsyncSession, username: str, password_data):
    user = await get_user_by_username(db, username)
    # 验证旧密码
    if not verify_password(password_data.old_password, user.password):
        raise False

    hashed_new_password = security.get_hash_password(password_data.new_password)
    user.password = hashed_new_password
    db.add(user) # 由 sqlalchemy 接管这个 user 对象,规避 session 过期或关闭导致不能提交的问题
    await db.commit()
    await db.refresh(user)

    return True

为什么修改密码中要db.add(user)?

29fastapi都有什么以及使用什么进行转换(orm,pydantic,字典)

30Depends有什么用?

Depends 是 FastAPI 的**依赖注入(Dependency Injection)**机制。一句话:它让你把"每个接口都需要、但又不属于接口核心业务"的通用工作(拿数据库会话、校验登录、解析参数等)抽成独立函数,声明一下就能自动执行并把结果塞进你的路由参数。

31收藏模块:检查新闻收藏状态

32添加收藏

33取消收藏

34获取收藏列表

这里面的label是什么意思?

起别名

python 复制代码
async def get_favorite_list(
        db: AsyncSession,
        user_id: int,
        page: int = 1,
        page_size: int = 10
):
    # 总量 + 收藏的新闻列表
    count_query = select(func.count()).where(Favorite.user_id == user_id)
    count_result = await db.execute(count_query)
    total = count_result.scalar()
    offset = (page - 1) * page_size

    # 获取收藏列表 - 联表查询 - 分页 - 收藏时间
    query = (select(News, Favorite.created_at.label("favorite_time"), Favorite.id.label("favorite_id"))
             .join(Favorite, Favorite.news_id == News.id)
             .where(Favorite.user_id == user_id)
             .order_by(Favorite.created_at.desc())
             .offset(offset).limit(page_size)
             )
    result = await db.execute(query)
    rows = result.all()
    return rows, total

为什么执行数据库db操作后得到的result还要得到rows?

列表怎么转字典?

复制代码
**news.__dict__,

data = FavoriteListResponse (list=favorite_list, total=total, hasMore=has_more) 这个有什么用?

这是 FastAPI + Pydantic 响应模型

FavoriteListResponse 就是定义接口返回数据的模板,用来约束返回字段、自动校验、自动生成接口文档,是后端项目规范写法。

35清空收藏列表

python 复制代码
# 清空收藏列表

async def clear_favorite(
        db: AsyncSession,
        user_id: int
):
    query = delete(Favorite).where(Favorite.user_id == user_id)
    result = await db.execute(query)
    await db.commit()
    return result.rowcount or 0

SQLAlchemy 中 delete 构造的只是查询对象,不会直接操作数据库,必须交给 session.execute 执行;异步模式下 execute 只是在事务内执行 SQL,需要 commit 提交事务,修改才持久化到数据库。

36浏览历史模块

37添加浏览记录

38获取浏览历史列表

为什么要连表查询?

  • History浏览历史表:存 用户 ID、新闻 ID、浏览时间(只存关联关系,没有新闻标题、内容)
  • News新闻表:存 新闻 id、标题、正文、封面(新闻主体信息)

为什么要获取是否有更多的消息?

39删除单条浏览记录

40清空浏览历史列表

41缓存和模型调用

python 复制代码
# 读字符串
async def get_cache(key: str):
    try:
        return await redis_client.get(key)
    except Exception as e:
        print(f"获取缓存失败:{e}")
        return None

# 读取列表或字典
async def get_json_cache(key: str):
    try:
        data = await redis_client.get(key)
        if data:
            return json.loads(data)
        return None
    except Exception as e:
        print(f"获取 JSON 缓存失败:{e}")
        return None

这两种方式有 什么区别?

42缓存新闻列表

**其实就是字典解包

因为redis只能存json数据,model_validate()可以把ORM转成Pydantic,model_dump()

复制代码
.model_dump(mode="json", by_alias=False)

43AI问答功能(调用大模型 )

44总结

FastAPI是基于Python的高性能异步Web框架,专用于快速构建API。其优点包括:异步支持、自动生成交互式文档、开发效率高、类型注解友好。核心知识涵盖路由、路径与查询参数、请求体、响应类型(如JSON、HTML、文件等)、异常处理、中间件、依赖注入、ORM(SQLAlchemy)及数据库操作。需掌握Depends依赖注入、async/await异步编程、Pydantic数据验证、全局异常处理器、JWT认证、缓存(Redis)等。通过model_validate和model_dump实现模型转换

相关推荐
NotBeBarnon8 小时前
做 AI 应用总在重复造轮子?我开源了一个 FastAPI 后端脚手架,开箱即用
fastapi
程序员清风1 天前
FastAPI 入门:用 Python 快速开发现代后端服务
python·oracle·fastapi
萧鼎2 天前
Python 高性能Web框架神器 FastAPI:自动生成API文、基于Pydant、异步请求处理全搞定
前端·python·fastapi
the局外人2 天前
学习 FastAPI 的 Day 3:企业级目录与数据库迁移
后端·python·fastapi
梦因you而美3 天前
LangChain-ReAct-Agent 智能客服系统 · 项目技术文档
langchain·agent·fastapi·扫地机器人·langgraph·rag 检索增强·react 智能客服
jsjzsl23 天前
独立自由度框架下位置自由度的本体论特征、物理现象与新技术路径
python·flask·fastapi
嘻哈baby3 天前
FastAPI + SQLite 从 0 写一个真正能用的待办 API
数据库·sqlite·fastapi
陈驰_05043 天前
需求列表接口 422 Unprocessable Entity 排查与修复全记录
状态模式·fastapi·vue 3
Json____3 天前
基于 FastAPI + Vue3 的在线拍卖系统技术解析
spring boot·后端·fastapi·wwwoop.com