目录
29fastapi都有什么以及使用什么进行转换(orm,pydantic,字典)
[43AI问答功能(调用大模型 )](#43AI问答功能(调用大模型 ))
1fastapi是什么,优点以及有哪些知识要学?
是一个基于python的高性能的web框架,专门用于快速构建api的接口服务
优点 异步性能高 /开发效率高 /自动生成文档
2fastapi基本代码
注意from import从fastapi库导入FastAPI模块,注意创建实例(app=FastAPI()),要不然每次都是新的实例
3怎么运行fastapi及访问交互式文档?
4路由是什么?
5请求参数有什么分类?
6路径参数怎么进行类型注解及代码体现?
**...**表示不能为空
7什么是查询参数及形式?
8Path()和Query()有什么区别?
9什么是请求体参数?
10响应类型有哪些及设置方式?
pythonfrom 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是什么意思?
起别名
pythonasync 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 0SQLAlchemy 中 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实现模型转换









































































































































