Flask从入门到进阶
豆瓣
Python Web开发工程化实践
Flask Web开发实战
李辉
简介
畅销书《Flask Web 开发实战》全新升级版。访问本书主页了解更多详细信息:https://helloflask.com/book/4
这是一本为各水平层次的 Python Web 开发者提供完整 Flask Web 开发知识体系的书,由 Flask 官方团队成员撰写,获得 Flask 之父 Armin Ronacher 的高度认可和推荐。
本书内容系统全面,从 Flask 的基础知识到完整的 Flask 项目实战,从 Flask Web API 开发到 Flask 应用的性能优化,从 Flask 项目的生产部署到 Flask 的源码解析,本书提供了完整的 Python Web 工程化学习路径。
本书实战案例丰富,基础篇的大部分章节都针对相应的知识点提供了完整可运行的示例程序,实战篇则通过 2 个较为完整的 Flask 项目讲解了 Flask 项目的组织方式和技巧,以及 Flask 开发中各类功能的实现方法和技巧。
内容紧跟技术发展,书中的代码和示例程序均基于 Flask 新发布的稳定版 3.x 编写,书中涉及的其他 Python 包和前端库也全部采用当前的新版本,确保本书在未来较长一段时间内仍可保持先进性和实用性。
本书共 14 章,分为三部分:
基础篇(第 1–7 章):通过丰富的示例讲解了 Flask 的核心基础与进阶技巧,为后续学习打下坚实基础。
实战篇(第 8–10 章):通过两个完整项目案例,将 Flask 的知识点融会贯通,带领读者完成从 0 到 1 的开发过程。
进阶篇(第 11–14 章):涵盖基于 Flask 与 APIFlask 的 Web API 开发、性能优化与生产部署,并深入剖析 Flask 的源码实现与核心机制。
本书不仅提供系统的知识讲解和完整的项目源码,还提供丰富的在线资源和活跃的读者社群。只要你了解 Python 的基本语法,无论你是零基础 Web 开发爱好者,还是想从事 Python Web 开发的后端工程师、运维工程师、爬虫工程师、数据科学工程师等,抑或是想要从 Django、FastAPI 等其他 Python Web 框架转向 Flask 的 Python 工程师,都能从中获益匪浅。掌握本书,你将不再畏惧任何复杂的 Web 开发需求,在 AI 时代构筑自己坚不可摧的核心竞争力。
contents
序
前言
基础篇
第 1 章 初识 Flask
1.1 搭建开发环境
1.1.1 创建练习项目目录
1.1.2 使用 PDM 管理虚拟环境和依赖
1.1.3 设置 PyPI 镜像源
1.1.4 安装 Flask
1.1.5 集成开发环境 PyCharm
1.2 Hello,Flask !
1.2.1 创建程序实例
1.2.2 注册路由
1.3 开发服务器
1.3.1 Run,Flask,Run !
1.3.2 程序自动发现机制
1.3.3 开启调试模式
1.3.4 使服务器对外可见
1.3.5 改变默认端口
1.3.6 使用 PyCharm 运行服务器
1.4 Flask Shell
1.5 Flask 扩展
1.6 项目配置
1.7 视图、URL 和端点
1.8 Flask 命令
1.9 模板与静态文件
1.10 获取和使用示例程序
1.11 本章小结
第 2 章 Flask 与 HTTP
2.1 请求 - 响应循环
2.2 HTTP 请求
2.2.1 存储请求信息的 request 对象
2.2.2 在 Flask 中处理请求
2.2.3 请求钩子
2.3 HTTP 响应
2.3.1 在 Flask 中生成响应
2.3.2 cookie 和 session 对象
2.4 Flask 上下文
2.4.1 上下文全局变量
2.4.2 推送上下文
2.4.3 上下文钩子
2.5 Web 安全防范
2.5.1 注入攻击
2.5.2 XSS 攻击
2.5.3 CSRF 攻击
2.6 小实践:重定向到上一个页面
2.6.1 获取上一个页面的 URL
2.6.2 对 URL 进行安全验证
2.7 本章小结
第 3 章 模板与静态文件
3.1 模板的基本用法
3.1.1 创建模板
3.1.2 模板语法
3.1.3 渲染模板
3.2 模板的辅助工具
3.2.1 模板上下文
3.2.2 全局对象
3.2.3 过滤器
3.2.4 测试器
3.2.5 模板环境对象
3.3 模板的组织结构
3.3.1 局部模板
3.3.2 宏
3.3.3 模板继承
3.4 静态文件
3.4.1 添加 Favicon
3.4.2 使用 CSS 框架:Bootstrap
3.4.3 JavaScript 和 CSS 中的 Jinja
3.5 消息闪现
3.5.1 在视图函数中发送消息
3.5.2 在模板中渲染消息
3.6 自定义错误页面
3.7 使用 Bootstrap-Flask 简化模板编写
3.8 本章小结
第 4 章 表单
4.1 HTML 表单
4.2 使用 WTForms 和 Flask-WTF 处理表单
4.2.1 定义表单类
4.2.2 输出表单 HTML 代码
4.2.3 在模板中渲染表单
4.3 处理表单数据
4.3.1 提交表单
4.3.2 验证表单数据
4.3.3 在模板中渲染错误消息
4.3.4 设置验证错误消息的语言
4.4 自定义验证器
4.4.1 验证方法
4.4.2 全局验证器
4.5 使用 Bootstrap-Flask 快速渲染表单
4.5.1 渲染表单字段
4.5.2 渲染整个表单
4.5.3 渲染表单行
4.5.4 设置提交按钮的样式
4.6 本章小结
第 5 章 数据库
5.1 数据库分类
5.1.1 SQL
5.1.2 NoSQL
5.1.3 如何选择数据库
5.2 ORM 魔法
5.3 安装和初始化 Flask-SQLAlchemy
5.4 连接数据库服务器
5.4.1 连接到 SQLite
5.4.2 连接到 MySQL
5.4.3 连接到 PostgreSQL
5.5 定义 SQLAlchemy 模型类
5.5.1 定义表名
5.5.2 定义字段
5.5.3 定义 repr() 方法
5.6 创建数据库表
5.7 数据库操作
5.7.1 会话
5.7.2 插入新记录
5.7.3 获取记录
5.7.4 过滤记录
5.7.5 更新记录
5.7.6 删除记录
5.8 配置 Python Shell 上下文
5.9 定义关系
5.9.1 一对多
5.9.2 多对一
5.9.3 一对一
5.9.4 多对多
5.9.5 基于只写加载器(Write-only Loader)获取集合关系记录
5.9.6 是否使用外键
5.10 更新数据库表与数据迁移
5.10.1 重新生成表
5.10.2 使用 Flask-Migrate 迁移数据库
5.10.3 开发时是否需要进行迁移
5.11 数据库高级实践
5.11.1 级联操作
5.11.2 事件监听
5.11.3 外键 ON DELETE 级联
5.12 使用 Faker 生成虚拟数据
5.13 小练习:编写一个记事本程序
5.13.1 创建笔记
5.13.2 显示笔记列表
5.13.3 更新笔记
5.13.4 删除笔记
5.14 本章小结
第 6 章 自动化测试
6.1 了解自动化测试
6.2 Flask 测试客户端
6.3 使用 unittest 编写单元测试
6.3.1 Flask 程序的测试固件
6.3.2 为测试创建程序上下文
6.3.3 编写测试用例
6.3.4 运行测试
6.4 测试 Flask 命令
6.5 使用 coverage.py 计算测试覆盖率
6.5.1 基本用法
6.5.2 获取测试覆盖率
6.5.3 使用 pytest-cov 集成 coverage.py
6.6 使用 Ruff 优化代码风格
6.6.1 代码风格检查
6.6.2 代码格式化
6.7 类型标注
6.8 本章小结
第 7 章 常用 Flask 开发技巧
7.1 使用 Flask-Mailman 发送电子邮件
7.1.1 配置 Flask-Mailman
7.1.2 构建邮件数据
7.1.3 发送邮件
7.1.4 发送多封邮件
7.1.5 提供 HTML 格式的邮件正文
7.1.6 使用模板组织邮件正文
7.1.7 异步发送邮件
7.2 使用 AJAX 发送异步请求
7.2.1 认识 AJAX
7.2.2 使用 Fetch API 发送 AJAX 请求
7.2.3 处理 AJAX 请求
7.2.4 处理 AJAX 响应
7.3 使用 Flask-WTF 上传文件
7.3.1 定义上传字段
7.3.2 渲染上传表单
7.3.3 处理上传文件
7.3.4 查看和下载上传文件
7.3.5 上传多个文件
7.4 使用 Flask-CKEditor 集成富文本编辑器
7.4.1 引入 CKEditor JavaScript 资源
7.4.2 定义 CKEditor 编辑器字段并渲染
7.4.3 配置 CKEditor 编辑器
7.4.4 获取编辑器字段数据并渲染
7.4.5 使用 Bleach 进行 HTML 安全清理
7.4.6 上传图片
7.5 使用 CSRFProtect 实现 CSRF 保护
7.5.1 设置 CSRF 令牌
7.5.2 处理 CSRF 错误
7.6 使用 Flask-DebugToolbar 调试程序
7.7 本章小结
实战篇
第 8 章 项目组织
8.1 基本项目组织技巧
8.1.1 使用包组织代码
8.1.2 在文件中存储程序配置
8.1.3 注册视图函数到程序实例
8.1.4 使用绝对导入
8.1.5 运行使用包组织的程序
8.1.6 创建子包
8.2 使用蓝本模块化程序
8.2.1 创建蓝本
8.2.2 装配蓝本
8.2.3 注册蓝本
8.2.4 蓝本的路由端点
8.2.5 蓝本静态文件和模板
8.2.6 蓝本嵌套
8.3 组织程序配置
8.3.1 从环境变量中读取配置
8.3.2 使用 python-dotenv 管理环境变量
8.3.3 使用 Python 类组织程序配置
8.4 使用工厂函数创建程序实例
8.4.1 初始化扩展
8.4.2 组织工厂函数
8.4.3 创建程序入口脚本
8.4.4 使用 current_app 获取程序实例
8.5 组织测试
8.6 项目组织架构
8.6.1 功能式架构
8.6.2 分区式架构
8.6.3 如何选择组织架构
8.7 本章小结
第 9 章 程序实例:个人博客
9.1 Web 程序开发流程
9.1.1 程序功能设计
9.1.2 前端页面开发
9.1.3 后端程序开发
9.1.4 部署上线
9.2 编写程序框架
9.2.1 创建数据库模型
9.2.2 邻接列表关系
9.2.3 生成虚拟数据
9.2.4 模板文件
9.2.5 基模板
9.2.6 模板上下文
9.2.7 视图函数
9.2.8 单元测试
9.3 渲染导航链接
9.4 实现 Flash 消息分类
9.5 日期和时间的本地化
9.5.1 存储 UTC 时间
9.5.2 使用 Day.js 渲染日期和时间
9.5.3 渲染不同语言的时间
9.5.4 渲染日期时间
9.5.5 渲染相对时间
9.6 编写博客前台
9.6.1 分页显示文章列表
9.6.2 显示文章正文
9.6.3 文章固定链接
9.6.4 显示分类文章列表
9.6.5 显示评论列表
9.7 文章评论与回复
9.7.1 发送评论提醒邮件
9.7.2 创建评论表单
9.7.3 发表评论
9.7.4 支持回复评论
9.8 网站主题切换
9.9 创建管理员用户
9.9.1 安全存储密码
9.9.2 创建用户命令
9.10 使用 Flask-Login 管理用户认证
9.10.1 获取当前用户
9.10.2 登录表单
9.10.3 登录用户
9.10.4 登出用户
9.10.5 视图保护
9.10.6 在单元测试中认证
9.11 编写博客管理后台
9.11.1 文章管理
9.11.2 评论管理
9.11.3 分类管理
9.12 本章小结
第 10 章 程序实例:图片社交网站
10.1 程序功能与数据库设计
10.1.1 数据库模型与虚拟图片
10.1.2 模板和静态文件
10.1.3 使用 Bootstrap 图标
10.2 用户注册与验证
10.2.1 实现用户注册
10.2.2 使用 JWT 进行邮箱验证
10.2.3 使用装饰器过滤未确认用户
10.2.4 密码重置
10.3 基于用户角色的权限管理
10.3.1 角色与权限模型
10.3.2 设置角色和权限
10.3.3 写入角色和权限
10.3.4 验证用户权限
10.4 使用 Flask-Dropzone 优化文件上传功能
10.4.1 配置 Flask-Dropzone
10.4.2 渲染上传区域
10.4.3 处理并保存上传图片
10.5 使用 Flask-Avatars 处理用户头像
10.5.1 使用默认头像
10.5.2 生成随机头像
10.6 图片展示与管理
10.6.1 在用户主页显示图片列表
10.6.2 图片详情页
10.6.3 上一张和下一张跳转
10.6.4 删除确认模态框
10.6.5 举报图片
10.6.6 图片描述
10.6.7 图片标签
10.6.8 用户资料弹窗
10.7 图片收藏
10.7.1 添加和取消收藏
10.7.2 收藏者和收藏页面
10.8 用户关注
10.8.1 自引用的多对多关系
10.8.2 关注与取消关注
10.8.3 显示关注用户列表
10.8.4 使用 AJAX 在弹窗中执行关注操作
10.9 消息提醒
10.9.1 提醒消息在数据库中的表示
10.9.2 创建提醒
10.9.3 显示和管理提醒
10.9.4 通过轮询实时更新未读计数
10.10 用户资料与账户设置
10.10.1 编辑用户个人资料
10.10.2 自定义头像
10.10.3 更改密码
10.10.4 设置提醒消息开关
10.10.5 将收藏设置为仅自己可见
10.10.6 注销账户
10.11 首页与探索
10.11.1 获取正在关注的用户的图片
10.11.2 使用联结和分组查询获取热门标签
10.11.3 使用数据库通用函数获取随机图片
10.12 使用 Flask-Whooshee 实现全文搜索
10.12.1 创建索引
10.12.2 搜索表单
10.12.3 显示搜索结果
10.13 编写网站后台
10.13.1 用户管理
10.13.2 资源管理
10.13.3 面向管理员的用户资料编辑功能
10.14 使用 Selenium 进行用户界面测试
10.14.1 基本用法
10.14.2 准备测试环境
10.14.3 编写测试代码
10.15 本章小结
进阶篇
第 11 章 Web API 开发
11.1 认识 Web API
11.2 资源 URL 和版本设计
11.2.1 多 API 版本的实现
11.2.2 为 API 蓝本禁用 CSRF 保护
11.2.3 设置 API 前缀
11.2.4 设置 API 子域
11.3 使用 HTTP 方法描述操作
11.3.1 快捷路由装饰器
11.3.2 使用类视图编写 API
11.4 使用 JSON 传输资源
11.4.1 获取 JSON 请求
11.4.2 生成 JSON 响应
11.4.3 处理错误响应
11.5 使用 Flask-CORS 添加 CORS 支持
11.6 使用 APIFlask 开发 Web API
11.6.1 基本用法
11.6.2 请求的验证与反序列化
11.6.3 响应的格式化与序列化
11.6.4 资源分页
11.6.5 程序错误处理
11.6.6 基于令牌的 API 认证
11.7 测试 Web API
11.7.1 使用 HTTPie 测试 API
11.7.2 为 API 编写单元测试
11.8 本章小结
第 12 章 性能分析与优化
12.1 程序性能分析
12.1.1 函数性能分析
12.1.2 数据库查询性能分析
12.2 使用 Flask-Caching 配置缓存
12.2.1 缓存视图函数
12.2.2 缓存其他函数
12.2.3 更新缓存
12.2.4 使用 Redis 作为缓存后端
12.3 使用 Flask-Assets 优化静态资源
12.3.1 注册资源集
12.3.2 生成资源集文件
12.3.3 在模板中加载资源集
12.4 本章小结
第 13 章 部署上线
13.1 部署方式
13.1.1 传统部署
13.1.2 容器部署
13.1.3 云部署
13.1.4 静态部署
13.2 基本部署流程
13.3 部署前的准备
13.3.1 更新程序配置
13.3.2 手动导入环境变量
13.3.3 设置迁移工具
13.3.4 记录程序日志
13.3.5 HTTPS 转发
13.3.6 安装 WSGI 服务器
13.4 传统部署:部署到 Linux 服务器
13.4.1 使用 OpenSSH 登录远程主机
13.4.2 安装基础库和工具
13.4.3 安全防护措施
13.4.4 推送代码并初始化程序环境
13.4.5 使用 Gunicorn 运行程序
13.4.6 使用 Nginx 提供反向代理
13.4.7 使用 Supervisor 管理进程
13.4.8 更新部署后的程序
13.5 容器部署:使用 Docker 进行部署
13.5.1 安装 Docker
13.5.2 构建程序镜像
13.5.3 运行和管理容器
13.5.4 配置管理
13.5.5 数据持久化
13.5.6 镜像分发
13.5.7 部署与升级
13.5.8 容器编排
13.6 下一步该做什么
13.7 本章小结
第 14 章 Flask 工作原理与机制解析
14.1 阅读 Flask 源码
14.1.1 获取 Flask 源码
14.1.2 如何阅读源码
14.2 Flask 的设计理念
14.2.1 “微”框架
14.2.2 两个核心依赖
14.2.3 显式程序对象
14.2.4 本地上下文
14.2.5 三种程序状态
14.2.6 丰富的自定义支持
14.3 Flask 与 WSGI
14.3.1 WSGI 程序
14.3.2 WSGI 服务器
14.3.3 中间件
14.4 Flask 的工作流程与机制
14.4.1 Flask 中的请求 - 响应循环
14.4.2 路由系统
14.4.3 本地上下文
14.4.4 请求与响应对象
14.4.5 session
14.4.6 蓝本
14.4.7 模板渲染
14.5 本章小结
附录 Flask 资源