Flask Web开发实战:入门、进阶与原理解析
作者:李辉
出版时间:2018年版
内容简介
本书由Flask官方团队的开发成员撰写,得到了Flask项目核心维护者的高度认可。 内容上,本书从基础知识到进阶实战,再到Flask原理和工作机制解析,涵盖完整的Flask Web开发学习路径,非常全面。 实战上,本书从开发环境的搭建、项目的建立与组织到程序的编写,再到自动化测试、性能优化,最后到生产环境的搭建和部署上线,详细讲解完整的Flask Web程序开发流程,用5个综合性案例将不同难度层级的知识点及具体原理串联起来,让你在开发技巧、原理实现和编程思想上都获得相应的提升。 技术上,基于Flask全新的稳定版本,同时兼容Python2.7和Python3.6,而且连相关的Python工具包使用的也是全新的版本。同时,对未来可能有变化的地方进行了说明,以此确保本书内容在一定时间内不会过时。 本书共16章,分为三部分。 第一部分 基础篇(第1~6章) 通过大量的程序实例详细介绍了Flask的所有基础知识,同时在每章的后面又提供了一些进阶技巧,供进阶读者学习。 第二部分 实战篇(第7~11章) 通过5个真实的项目案例来串接和阐释不同的知识点,难度逐渐递增。这5个案例分别为:留言板SayHello、个人博客Bluelog、图片社交网站Albumy、待办事项程序Todoism和聊天室CatChat。 第三部分 进阶篇(第12~16章) 首先介绍了Flask程序的部署流程:测试、性能优化和部署上线;然后通过一个真实的实例讲解了Flask扩展的开发,最后以源代码为切入点深入剖析了Flask的实现原理与主要工作机制。
目录
目录 Contents
前言
第一部分 基础篇
第1章 初识Flask2
1.1 搭建开发环境3
1.1.1 Pipenv工作流3
1.1.2 安装Flask7
1.1.3 集成开发环境8
.2 Hello, Flask!11
1.2.1 创建程序实例11
1.2.2 注册路由12
1.3 启动开发服务器14
1.3.1 Run,Flask,Run!14
1.3.2 更多的启动选项18
1.3.3 设置运行环境18
1.4 Python Shell20
1.5 Flask扩展21
1.6 项目配置22
1.7 URL与端点23
1.8 Flask命令23
1.9 模板与静态文件24
1.10 Flask与MVC架构25
1.11 本章小结26
第2章 Flask与HTTP27
2.1 请求响应循环27
2.2 HTTP请求29
2.2.1 请求报文29
2.2.2 Request对象31
2.2.3 在Flask中处理请求34
2.2.4 请求钩子37
2.3 HTTP响应38
2.3.1 响应报文39
2.3.1 在Flask中生成响应40
2.3.2 响应格式43
2.3.3 来一块Cookie46
2.3.4 session:安全的Cookie49
2.4 Flask上下文54
2.4.1 上下文全局变量54
2.4.2 激活上下文55
2.4.3 上下文钩子56
2.5 HTTP进阶实践57
2.5.1 重定向回上一个页面57
2.5.2 使用AJAX技术发送异步请求60
2.5.3 HTTP服务器端推送64
2.5.4 Web安全防范65
2.6 本章小结74
第3章 模板75
3.1 模板基本用法75
3.1.1 创建模板76
3.1.2 模板语法77
3.1.3 渲染模板78
3.2 模板辅助工具80
3.2.1 上下文80
3.2.2 全局对象82
3.2.3 过滤器83
3.2.4 测试器85
3.2.5 模板环境对象87
3.3 模板结构组织88
3.3.1 局部模板88
3.3.2 宏88
3.3.3 模板继承90
3.4 模板进阶实践93
3.4.1 空白控制93
3.4.2 加载静态文件94
3.4.3 消息闪现98
3.4.4 自定义错误页面100
3.4.5 JavaScript和CSS中的Jinja2101
3.5 本章小结103
第4章 表单104
4.1 HTML表单104
4.2 使用Flask-WTF处理表单106
4.2.1 定义WTForms表单类106
4.2.2 输出HTML代码109
4.2.3 在模板中渲染表单110
4.3 处理表单数据112
4.3.1 提交表单112
4.3.2 验证表单数据113
4.3.3 在模板中渲染错误消息117
4.4 表单进阶实践118
4.4.1 设置错误消息语言118
4.4.2 使用宏渲染表单120
4.4.3 自定义验证器121
4.4.4 文件上传122
4.4.5 使用Flask-CKEditor集成富文本编辑器129
4.4.6 单个表单多个提交按钮132
4.4.7 单个页面多个表单133
4.5 本章小结137
第5章 数据库138
5.1 数据库的分类139
5.1.1 SQL139
5.1.2 NoSQL139
5.1.3 如何选择?140
5.2 ORM魔法140
5.3 使用Flask-SQLAlchemy管理数据库142
5.3.1 连接数据库服务器142
5.3.2 定义数据库模型144
5.3.3 创建数据库和表145
5.4 数据库操作146
5.4.1 CRUD147
5.4.2 在视图函数里操作数据库151
5.5 定义关系156
5.5.1 配置Python Shell上下文157
5.5.2 一对多158
5.5.3 多对一164
5.5.4 一对一165
5.5.5 多对多166
5.6 更新数据库表168
5.6.1 重新生成表168
5.6.2 使用Flask-Migrate迁移数据库169
5.6.3 开发时是否需要迁移?171
5.7 数据库进阶实践172
5.7.1 级联操作172
5.7.2 事件监听175
5.8 本章小结177
第6章 电子邮件178
6.1 使用Flask-Mail发送电子邮件179
6.1.1 配置Flask-Mail179
6.1.2 构建邮件数据182
6.1.3 发送邮件182
6.2 使用事务邮件服务SendGird183
6.2.1 注册SendGird183
6.2.2 SendGrid SMTP转发185
6.2.3 SendGrid Web API转发185
6.3 电子邮件进阶实践188
6.3.1 提供HTML正文188
6.3.2 使用Jinja2模板组织邮件正文189
6.3.3 异步发送邮件191
6.4 本章小结192
第二部分 实战篇
第7章 留言板194
7.1 使用包组织代码195
7.1.1 配置文件196
7.1.2 创建程序实例197
7.2 Web程序开发流程198
7.2.1 程序功能设计199
7.2.1 前端页面开发200
7.2.3 后端程序开发202
7.3 使用Bootstrap-Flask简化页面编写206
7.3.1 加载资源文件207
7.3.2 快捷渲染表单207
7.4 使用Flask-Moment本地化日期和时间209
7.4.1 本地化前的准备209
7.4.2 使用Flask-Moment集成Moment.js209
7.4.3 渲染时间日期210
7.5 使用Faker生成虚拟数据213
7.6 使用Flask-DebugToolbar调试程序215
7.7 Flask配置的两种组织形式216
7.7.1 环境变量优先217
7.7.2 实例文件夹覆盖217
7.8 本章小结218
第8章 个人博客219
8.1 大型项目结构220
8.1.1 使用蓝本模块化程序221
8.1.2 使用类组织配置227
8.1.3 使用工厂函数创建程序实例228
8.2 编写程序骨架232
8.2.1 数据库233
8.2.2 模板240
8.2.3 表单246
8.2.4 视图函数249
8.2.5 电子邮件支持249
8.3 编写博客前台251
8.3.1 分页显示文章列表251
8.3.2 显示文章正文258
8.3.3 文章固定链接259
8.3.4 显示分类文章列表262
8.3.5 显示评论列表263
8.3.6 发表评论与回复266
8.3.7 支持回复评论267
8.3.8 网站主题切换269
8.4 初始化博客271
8.4.1 安全存储密码271
8.4.2 创建管理员用户273
8.5 使用Flask-Login管理用户认证275
8.5.1 获取当前用户276
8.5.2 登入用户277
8.5.3 登出用户278
8.5.4 视图保护279
8.6 使用CSRFProtect实现CSRF保护281
8.7 编写博客后台283
8.7.1 文章管理284
8.7.2 评论管理291
8.7.3 分类管理297
8.8 本章小结298
第9章 图片社交网站299
9.1 项目组织架构300
9.1.1 功能式架构300
9.1.2 分区式架构302
9.1.3 混合式架构303
9.1.4 如何选择303
9.2 编写程序骨架303
9.2.1 数据库模型与虚拟数据305
9.2.2 模板与静态文件307
9.3 高级用户认证308
9.3.1 用户注册309
9.3.2 验证邮箱地址311
9.3.3 使用装饰器过滤未确认用户315
9.3.4 密码重置316
9.4 基于用户角色的权限管理319
9.4.1 角色与权限模型319
9.4.2 设置角色与权限320
9.4.3 写入角色与权限321
9.4.4 验证用户权限323
9.5 使用Flask-Dropzone优化文件上传325
9.5.1 配置Flask-Dropzone326
9.5.2 渲染上传区域328
9.5.3 处理并保存上传图片329
9.6 使用Flask-Avatars处理用户头像334
9.6.1 默认头像335
9.6.2 生成随机头像335
9.7 图片展示与管理337
9.7.1 在用户主页显示图片列表338
9.7.2 图片详情页341
9.7.3 上一张下一张跳转342
9.7.4 删除确认模态框344
9.7.5 举报图片346
9.7.6 图片描述347
9.7.7 图片标签349
9.7.8 用户资料弹窗353
9.8 收藏图片358
9.8.1 使用关联模型表示多对多关系358
9.8.2 添加和取消收藏360
9.8.3 收藏者和收藏页面362
9.9 用户关注365
9.9.1 自引用多对多关系365
9.9.2 关注与取消关注366
9.9.3 显示关注用户列表369
9.9.4 使用AJAX在弹窗中执行关注操作371
9.10 消息提醒378
9.10.1 提醒消息在数据库中的表示379
9.10.2 创建提醒379
9.10.3 显示和管理提醒380
9.10.4 通过轮询实时更新未读计数382
9.11 用户资料与账户设置384
9.11.1 编辑个人资料385
9.11.2 自定义头像386
9.11.3 更改密码392
9.11.4 提醒消息开关394
9.11.5 将收藏设为仅自己可见395
9.11.6 注销账户396
9.12 首页与探索397
9.12.1 获取正在关注用户的图片399
9.12.2 使用联结和分组查询获取热门标签401
9.12.3 使用数据库通用函数获取随机图片402
9.13 使用Flask-Whooshee实现全文搜索403
9.13.1 创建索引404
9.13.2 搜索表单405
9.13.3 显示搜索结果406
9.14 编写网站后台407
9.14.1 用户管理408
9.14.2 资源管理411
9.14.3 面向管理员的用户资料编辑412
9.15 本章小结413
第10章 待办事项程序415
10.1 使用JavaScript和AJAX编写单页程序417
10.1.1 单页程序的模板组织418
10.1.2 在根页面内切换子页面421
10.1.3 生成测试账户423
10.1.4 添加新待办条目424
10.2 国际化与本地化426
10.2.1 使用Flask-Babel集成Babel427
10.2.2 区域和语言427
10.2.3 文本的国际化432
10.2.4 文本的本地化433
10.2.5 时间与日期的本地化438
10.3 设计并编写Web API440
10.3.1 认识Web API441
10.3.2 设计优美实用的Web API443
10.3.3 使用Flask编写Web API446
10.3.4 使用OAuth认证453
10.3.5 资源的序列化461
10.3.6 资源的反序列化465
10.3.7 Web API的测试与发布470
10.4 本章小结473
第11章 在线聊天室474
11.1 编写程序骨架476
11.2 Gravatar头像477
11.3 使用Flask-SocketIO建立实时双向通信480
11.3.1 建立Socket.IO连接481
11.3.2 一条消息的旅程482
11.3.3 在线人数统计485
11.3.4 通信频道分离486
11.4 使用Flask-OAuthlib实现第三方登录489
11.4.1 编写OAuth客户端490
11.4.2 注册OAuth程序491
11.4.3 处理OAuth2授权493
11.4.4 处理OAuth1授权505
11.5 聊天室功能增强507
11.5.1 无限滚动加载历史消息507
11.5.2 Markdown支持510
11.5.3 代码语法高亮512
11.5.4 标签页消息提醒515
11.5.5 浏览器桌面通知517
11.5.6 消息管理519
11.6 本章小结519
第三部分 进阶篇
第12章 自动化测试522
12.1 认识自动化测试522
12.2 Flask测试客户端523
12.3 使用unittest编写单元测试525
12.3.1 Flask程序的测试固件525
12.3.2 编写测试用例527
12.3.3 组织测试533
12.3.4 运行测试535
12.4 使用Selenium进行用户界面测试536
12.4.1 安装浏览器与驱动537
12.4.2 准备测试环境538
12.4.3 编写测试代码539
12.5 使用Coverage.py计算测试覆盖率541
12.5.1 基本用法542
12.5.2 获取测试覆盖率543
12.6 使用Flake8检查代码质量544
12.7 本章小结546
第13章 性能优化547
13.1 程序性能分析548
13.1.1 函数性能分析548
13.1.2 数据库查询分析549
13.2 使用Flask-Caching设置缓存551
13.2.1 缓存视图函数552
13.2.2 缓存其他函数554
13.2.3 更新缓存554
13.2.4 使用Redis作为缓存后端556
13.3 使用Flask-Assets优化静态资源557
13.3.1 注册资源集558
13.3.2 生成资源集文件559
13.3.3 在模板中加载资源集559
13.4 本章小结562
第14章 部署上线563
14.1 传统部署VS云部署563
14.2 基本部署流程564
14.3 部署前的准备566
14.3.1 更新程序配置566
14.3.2 创建生产环境专用的程序实例567
14.3.3 设置迁移工具568
14.3.4 程序日志568
14.3.5 手动导入环境变量572
14.3.6 HTTPS转发572
14.4 部署到Linux服务器573
14.4.1 使用OpenSSH登录远程主机573
14.4.2 安装基本库和工具574
14.4.3 安全防护措施575
14.4.4 推送代码并初始化程序环境578
14.4.5 使用Gunicorn运行程序579
14.4.6 使用Nginx提供反向代理580
14.4.7 使用Supervisor管理进程584
14.4.8 更新部署后的程序586
14.5 部署到PythonAnywhere587
14.5.1 反向代理设置587
14.5.2 创建PythonAnywhere程序588
14.5.3 推送代码并初始化程序环境588
14.5.4 创建数据库590
14.5.5 设置虚拟环境591
14.5.6 静态文件592
14.5.7 运行和更新程序592
14.6 部署到Heroku594
14.6.1 通过Heroku Git部署595
14.6.2 使用GitHub部署601
14.7 下一步做什么?603
14.8 本章小结604
第15章 Flask扩展开发605
15.1 扩展的命名606
15.2 扩展项目骨架606
15.3 编写扩展类608
15.4 添加扩展配置610
15.5 实现扩展功能610
15.5.1 加载静态资源611
15.5.2 创建分享组件612
15.5.3 在移动设备上隐藏613
15.6 开源发布前的准备614
15.6.1 添加文档字符串与注释614
15.6.2 编写README与文档615
15.6.3 为打包做准备616
15.6.4 编写示例程序621
15.6.5 编写单元测试621
15.7 发布到PyPI622
15.7.1 创建PyPI账号623
15.7.2 使用setuptools打包623
15.7.3 使用twine上传625
15.8 编写良好的扩展625
15.9 本章小结627
第16章 Flask工作原理与机制解析628
16.1 阅读Flask源码628
16.1.1 获取Flask源码628
16.1.2 如何阅读源码629
16.1.3 Flask发行版本分析637
16.2 Flask的设计理念638
16.2.1 “微”框架638
16.2.2 两个核心依赖638
16.2.3 显式程序对象638
16.2.4 本地上下文639
16.2.5 三种程序状态640
16.2.6 丰富的自定义支持641
16.3 Flask与WSGI641
16.3.1 WSGI程序642
16.3.2 WSGI服务器643
16.3.3 中间件644
16.4 Flask的工作流程与机制646
16.4.1 Flask中的请求响应循环646
16.4.2 路由系统649
16.4.3 本地上下文653
16.4.4 请求与响应对象665
16.4.5 session667
16.4.6 蓝本674
16.4.7 模板渲染677
16.5 本章小结680
附录A Flask资源681