新書推薦:
《
趣学CCNA——路由与交换(第2版)
》
售價:NT$
458.0
《
世界航空地理(世界国别与区域地理研究丛书)
》
售價:NT$
1112.0
《
学术的中心:英法德美
》
售價:NT$
398.0
《
为什么要读人类学
》
售價:NT$
352.0
《
井邑无衣冠 : 地方视野下的唐代精英与社会
》
售價:NT$
434.0
《
星地融合移动通信系统与关键技术从5G NTN到6G的卫星互联网发展
》
售價:NT$
968.0
《
妈妈,你好吗?(一封写给妈妈的“控诉”信,日本绘本奖作品)
》
售價:NT$
194.0
《
保守主义:为传统而战
》
售價:NT$
704.0
|
編輯推薦: |
(1)作者是Flask官方开发团队成员,为Flask和其他多个Python项目贡献源代码,是知乎著名专栏Hello, Flask!的作者
(2)本书获得Flask开发团队核心维护者高度评价
(3)内容全面,从基础知识到进阶实战,再到源码分析,提供完善的Flask学习路径;
(4)实战性强,5个综合性案例将不同难度层级的知识点及具体原理串联起来,让你在开发技巧、原理实现和编程思想上都获得相应提升;
(5)技术新颖,Flask框架本身,以及其他相关Python框架,全部使用的是新发布的技术版本。
|
內容簡介: |
本书由Flask官方团队的开发成员撰写,得到了Flask项目核心维护者的高度认可。
内容上,本书从基础知识到进阶实战,再到Flask原理和工作机制解析,涵盖完整的Flask Web开发学习路径,非常全面。
实战上,本书从开发环境的搭建、项目的建立与组织到程序的编写,再到自动化测试、性能优化,*后到生产环境的搭建和部署上线,详细讲解完整的Flask Web程序开发流程,用5个综合性案例将不同难度层级的知识点及具体原理串联起来,让你在开发技巧、原理实现和编程思想上都获得相应的提升。
技术上,不仅Flask使用的是新发布的稳定版,而且连相关的Python工具包使用的也是全新的版本,同时对未来可能有变化的地方进行了说明,以此确保本书内容在一定时间内不会过时。
本书共16章,分为三部分。
*部分基础篇(第1~6章)
通过大量的程序实例详细介绍了Flask的所有基础知识,同时在每章的后面又提供了一些进阶技巧,供进阶读者学习。本书由Flask官方团队的开发成员撰写,得到了Flask项目核心维护者的高度认可。
内容上,本书从基础知识到进阶实战,再到Flask原理和工作机制解析,涵盖完整的Flask Web开发学习路径,非常全面。
实战上,本书从开发环境的搭建、项目的建立与组织到程序的编写,再到自动化测试、性能优化,*后到生产环境的搭建和部署上线,详细讲解完整的Flask Web程序开发流程,用5个综合性案例将不同难度层级的知识点及具体原理串联起来,让你在开发技巧、原理实现和编程思想上都获得相应的提升。
技术上,不仅Flask使用的是新发布的稳定版,而且连相关的Python工具包使用的也是全新的版本,同时对未来可能有变化的地方进行了说明,以此确保本书内容在一定时间内不会过时。
本书共16章,分为三部分。
*部分 基础篇(第1~6章)
通过大量的程序实例详细介绍了Flask的所有基础知识,同时在每章的后面又提供了一些进阶技巧,供进阶读者学习。
第二部分 实战篇(第7~11章)
通过5个真实的项目案例来串接和阐释不同的知识点,难度逐渐递增。这5个案例分别为:留言板SayHello、个人博客Bluelog、图片社交网站Albumy、待办事项程序Todoism和聊天室CatChat。
第三部分 进阶篇(第12~16章)
首先介绍了Flask程序的部署流程:测试、性能优化和部署上线;然后通过一个真实的实例讲解了Flask扩展的开发,*后以源代码为切入点深入剖析了Flask的实现原理与主要工作机制。
|
關於作者: |
李辉(Grey Li)
Flask官方开发团队(Pallets Team)成员,知乎专栏Hello, Flask!作者,HelloFlask.com网站创建者。对Flask有非常深入的研究,熟悉它的源代码,有丰富的项目经验。
他热爱分享和创造,曾为Flask等多个开源项目贡献过代码,你可以在GitHub(github.comgreyli)上看到他的开源活动。在他的个人网站(greyli.com)上,你可以了解到关于他的更多信息。
|
目錄:
|
前言
第一部分 基础篇
第1章 初识Flask2
1.1 搭建开发环境3
1.1.1 Pipenv工作流3
1.1.2 安装Flask7
1.1.3 集成开发环境8
1.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
|
內容試閱:
|
Flask是目前最流行的Python Web框架之一。自2010年开源以来,Flask受到了越来越多的Python开发者的喜欢,其受欢迎程度不输于Django。截至2018年6月,它在GitHub上已有近36 000个Star,2000多位Watcher,是目前GitHub中Star数最多的Python Web框架。
Flask的logo
Flask的图标虽然看起来很像辣椒,但其实它是角状的容器(powder horn)。
Flask仅保留了Web框架的核心,其他的功能都交给扩展实现。如果没有合适的扩展,你甚至可以自己编写。Flask不会替你做决定,也不会限制你的选择。它足够轻量,你可以只用5行就编写出一个最简单的Web程序,但并不简陋,它能够适应各类项目的开发。
因为Flask的灵活性,越来越多的公司选择Flask作为Web框架,甚至开始从Django迁移到Flask。使用Flask的公司在国外有Netflix、Reddit、Twilio、Mailgun等,在国内则有豆瓣、果壳、下厨房等,这说明Flask能经受大型项目的挑战,能够适应各种需求。下图列出了部分使用Flask的公司。
你可以在StackShare上查看完整的使用Flask的公司列表(https:stackshare.ioflask)。
使用Flask的公司
在国内,越来越多的Python程序员开始关注和学习Flask。对于国内的程序员来说,相关书籍仅有一两本,内容上也过于陈旧和单薄,希望本书可以填补这一空白。本书提供了学习Flask的完整路径,从基础内容到进阶实践,再到源码分析。同时也安排了丰富的示例程序,让读者可以通过亲自实践来更快地掌握Flask开发。
Flask自2010年开源以来在Google上的搜索趋势
目标读者
在技术层面,本书适合所有Python程序员(了解Python即可)阅读,包括已经学习过其他Python Web框架(比如Django)的读者和没有接触过Web框架的读者。
在难度水平层面,本书适合新手以及中级读者阅读。新手会在这里学到Flask的基础内容,并且通过丰富、完善的实例学习Flask开发的方方面面;中级读者则可以通过阅读和实践进阶内容来进一步提高Flask开发能力。
综上所述,本书主要适合以下几类读者:
了解Python基本语法,想要自己动手做网站的编程爱好者。
熟悉Python,想要从事Python Web开发的后端工程师、运维工程师和爬虫工程师。
想要从Django等其他Python Web框架转向Flask的Python工程师。
本书主要特点
本书主要有三个显著的特点:
(1)内容全面
本书内容覆盖了Flask Web开发的完整路径:从基础知识的学习,到不同类型和复杂程度的程序的编写,再到代码的测试优化以及Flask源码分析;从基础的内容管理,到用户认证和权限管理,再到Flask与JavaScript的数据交互、Web API的编写以及WebSocket的应用等。
(2)实践丰富
本书包含大量代码片段,并附带多个完整可运行的示例程序。在本书第一部分的第2~6章均分别提供一个示例程序;第二部分则会通过介绍5个比较完善的Flask项目来讲解各个方面的进阶知识;在第三部分还会通过一个真实的扩展来讲解Flask扩展开发。通过将各类知识融入实际的项目开发实践中,可以让你更直观地了解具体的代码实现,并且快速应用到实际开发中。
(3)内容最新
本书的另一个特点就是内容保证最新。书中的代码和示例程序都基于Flask最新发布的稳定版1.0。书中涉及的其他Pyhton包和前端框架(Boostrap、Materialize等)全部使用最新版本,并且对未来可能会有的变化会加以说明。这些特点可以保证书中的内容在一定时间内不会过时。对于其他书籍或教程中存在的关于Flask的误区,本书也会逐一纠正说明。
除了使用的工具保持最新,本书还引入了Python和Flask开发中的新变化,比如Flask的命令行系统、新的Python包管理工具(Pipenv)、新的包上传工具(twine)、新的PyPI站点(https:pypi.org)、在PyPI上使用Markdown格式的README
本书核心内容
本书由三部分组成,分别为基础篇、实战篇、进阶篇,共16章。本书章节经过精心设计,力求让读者可以循序渐进地掌握Flask开发的基础知识和技巧。
第一部分:基础篇。介绍Flask开发相关的基础知识。
第1章:搭建开发环境,编写一个最小的Flask程序并运行它,了解Flask基本知识。
第2章:介绍Flask与HTTP的交互方式以及相关的Flask功能。
第3章:介绍Jinja2模板的使用。
第4章:介绍Web表单的创建和表单数据的验证。
第5章:介绍在Flask程序中使用数据库进行CRUD操作。
第6章:介绍在Flask程序中发送电子邮件的几种方式。
第二部分:实战篇。通过几个示例程序来介绍Flask开发中各类功能的实现方法和技巧。
第7章:通过一个简单的留言板程序SayHello介绍Web开发的基本流程和基本的项目管理方式,对第一部分的基础知识进行简单回顾。
第8章 :通过个人博客程序Bluelog介绍CRUD操作、用户认证、文章评论、管理后台等功能。
第9章:通过图片社交程序Albumy介绍用户注册和认证、用户权限管理、图片上传与处理、用户头像、复杂的数据库关系、复杂的数据库查询、全文搜索等内容。
第10章:通过待办事项程序Todoism介绍单页应用、国际化与本地化、Web API、OAuth服务器端实现等内容。
第11章:通过聊天室程序CatChat介绍Websocket应用、OAuth客户端实现(第三方登录)、Markdown支持、代码语法高亮等内容。
第三部分:进阶篇。介绍Flask程序的部署流程,如测试、性能优化、部署上线;介绍Flask开发的进阶话题,如Flask扩展开发、Flask源码与机制分析。
第12章:介绍Flask程序的自动化测试,包括单元测试和UI测试的编写、计算测试覆盖率和代码质量检查。
第13章:介绍对Flask程序进行性能优化的主要措施,包括函数与数据库查询的性能分析、缓存的使用、静态文件优化。
第14章:介绍部署Flask程序前的准备,以及部署到Linux服务器和云平台Heroku、PythonAnywhere的完整流程。
第15章:通过扩展Flask-Share来介绍编写Flask扩展的完整流程,从创建项目到上传到PyPI。
第16章:介绍Flask的一些设计理念,包括底层WSGI的相关实现,并对各个主要功能点进行源码分析。
此外,书的最后还提供了附录A,补充介绍一些Flask学习相关的资源。
阅读前的准备
在开始我们的Flask之旅前,还有一些准备工作要做。首先,你要有一台安装了Python(https:www.python.org)的电脑,并且,你要了解Python的基础知识。
本书中所有示例程序的代码均通过了Python 2.7和Python 3.6的测试,建议你选用这两个版本。因为大多数Python包(包括Flask)已经不再支持Python 2.6及以下版本,以及Python 3.3及以下版本,确保不要使用这些版本。另外,Python官方社区将于2020年1月1日停止对Python 2.的维护,这或许可以作为你选择Python版本时的考量之一。
其次,本书有大量操作需要在命令行(CLI,Command Line Interface)下进行,所以你要熟悉你所在操作系统下的命令行。书中会在涉及操作系统特定的命令时给出提示,Windows系统给出的命令对应的是CMD.exe,Linux和macOS系统则对应的是Bash。
最后,HTML、CSS、JavaScript分别作为一个Web页面的结构层、表现层和行为层,是Web开发的基础,你需要对它们有基本的了解。任何一个Web程序都是由单个或多个Web页面,页面上包含的内容,以及按钮、表单等交互组件构成的。在本书中,我们会使用Flask操作HTML页面;为了让HTML页面更加美观,我们会使用CSS定义样式,为了简化编写样式的操作,我们会使用CSS框架,比如Bootstrap(http:getbootstrap.com);为了让某些操作更加合理和方便,或为了给程序增加动画效果,我们会使用JavaScript来操作页面元素,为了简化编写JavaScript的工作,我们会使用JavaScript库jQuery(https:jquery.com)。
在Web开发中,大部分程序离不开JavaScript,JavaScipt可以很方便、简洁地实现很多页面逻辑和功能。为了更多地介绍Flask,本书将尽量避免使用过多的JavaScipt代码。
如果你还不熟悉这些内容,那么可以通过下面的网站来快速入门:
W3Schools(https:www.w3schools.com)。
MDN Web文档(https:developer.mozilla.orgdocsWeb)。
Codecademy(https:www.codecademy.com)。
使用示例程序
示例程序均使用Git来管理程序版本,为了便于大家获取示例程序,代码均托管在GitHub(https:github.com)上。Git(https:git-scm.com)是最流行的开源VCS(Version Control System,版本控制系统),大多数项目都使用它来追踪文本文件(代码)的变化。Git非常易于上手,如果你还不熟悉它,可以访问Try Git(https:try.github.io)来快速了解Git。
你可以访问Git官网的下载页面(https:git-scm.comdownloads)了解不同操作系统下Git的安装方法,安装成功后即可使用它来获取示例程序。下面介绍了两种使用示例程序的方式。
1.阅读示例程序
因为示例程序都托管在GitHub上,所以阅读示例程序最简单的方式是在浏览器中阅读。在对应的章节,我们会给出示例程序在GitHub上的仓库链接。
如果要在本地阅读,那么首先使用git clone命令把GitHub上的示例程序克隆(即复制)到本地,以本书的项目仓库为例:
$ git clone https:github.comgreylihelloflask.git
clone命令后面的参数是远程Git仓库的URL,最后的.git后缀可以省略。这里的URL中的传输协议使用了https:协议,你也可以使用git:协议,即git:github.comgreylihelloflask.git。
使用ls(即List)命令(Windows下使用dir命令)列出当前目录下的文件信息,你会看到当前目录中多了一个helloflask文件夹,这就是我们刚刚复制下来的项目仓库。下面使用cd(即change directory)命令切换进这个文件夹:
$ cd helloflask
现在你可以使用你喜欢的文本编辑器打开项目文件夹并准备阅读了。建议使用轻量的文本编辑器来阅读示例代码,比如Atom(https:atom.io)、Sublime Text(https:www.sublimetext.com)或Notepad(https:notepad-plus-plus.org)。
在对应章节的开始处都会包含从GitHub复制程序、创建虚拟环境并运行程序的基本步骤,你可以一边阅读源码,一边实际尝试使用对应的程序功能。
示例程序根据章节内容设置了对应的标签,每个标签都对应了一个程序版本。你可以使用git tag -n命令查看当前项目仓库中包含的所有标签:
$ git tag -n
使用git checkout命令即可签出对应标签版本的代码,添加标签名作为参数,比如:
$ git checkout foo
在后面,书中会在每一次包含更改文件的章节提示应该签出的标签名。如果在执行新的签出命令之前,你对文件做了修改,那么需要使用git reset命令来撤销改动:
$ git reset --hard
git reset命令会删除本地修改,如果你希望修改示例程序源码并保存修改,可以参考后面的改造示例程序部分。
如果你想比较两个版本之间的变化,可以使用git diff命令,添加比较的两个标签作为参数,比如:
$ git diff foo bar
如果你想更直观地查看版本变化,可以使用下面的命令打开内置的Git浏览客户端:
$ gitk
除了内置的Git客户端,还有大量的第三方客户端可以使用,详情可以访问https:git-scm.comdownloadsguis查看。另外,你也可以访问GitHub的Web页面查看不同版本(标签)的变化,即查看某项目两个版本之间的变化可以访问https:github.com用户名仓库名compare标签A...标签B,比如对foo和bar标签进行比较可以访问https:github.comgreylihelloflaskcomparefoo...bar。
最后,你可以定期使用git fetch命令来更新本地仓库:
$ git fetch --all
$ git fetch --tags
$ git reset --hard originmaster
2.改造示例程序
只看菜谱是不能学会烹饪的,自己动手编写代码才是学习Flask最有效的途径。你可以在阅读示例程序的同时编写自己的Flask程序,将书中介绍的内容和实际的示例程序代码作为参照。另外,你也可以创建一份示例程序的拷贝(派生,fork),这样你就可以自由地修改示例程序的源码,改造成你自己的示例程序。创建派生仓库的主要步骤如下:
1)注册一个GitHub账号(https:github.com)。
2)访问示例程序的GitHub仓库页面(比如https:github.comgreylihelloflask),单击右上角的Fork按钮创建一个派生仓库,如下图所示。
创建派生仓库
3) 在本地使用git clone命令复制新创建的派生仓库,使用你的用户名构建URL:
$ git clone https:github.com你的用户名helloflask.git
现在你可以在本地自由修改实例程序,并提交到你的GitHub账户的远程仓库中了。
排版约定
Windows中的命令提示符为,而Linux或macOS中的命令提示符为$,本书中将统一使用美元符号(即$)作为命令提示符,比如:
$ cd hello
命令提示符为三个大于号(即)的表示Python Shell中输入的代码,比如:
import os
$或标记的文本下方没有命令提示符的文字表示输出的字符,不需要打出,比如:
$ cat hello.txt
Hello, Flask!
为了节省篇幅,本书中的代码片段没有严格遵照PEP8的约定,比如类和函数之间的空行被缩减为1行。另外,出现过的导入语句和无关的代码块会被省略掉。为了节省篇幅,代码中重复或不相干的部分都使用三个省略号代替,比如:
def do_someting:
...
if foo:
return False
return True
代码、命令或URL中有时会使用来标识演示内容,在实际输入中并不需要写出,比如:
https:github.com
因为在示例代码中通常会引入大量随机字符,这些随机字符包含下面的使用规则。
列表1:spam、ham、eggs。
列表2:foo、bar、baz、qux、quux、quuz、corge、grault、garply、waldo、fred。
人名会使用Grey Li或grey。
网站会使用helloflask.com或example.com。
其他需要读者自己修改的占位字符会使用类似your_password、you_email的文本。
最后,为了尽量让正文保持简洁,每一章新涉及的Python库都会在第一小节前汇总列出对应的版本和相关链接(比如主页、源码和文档)。因为大部分项目在PyPI上提供的介绍都不够完善,除非程序有独立的主页,否则会优先使用GitHub或BitBucket上的项目页面作为主页。
读者反馈与疑问
由于笔者水平有限,编写时间也比较仓促,书中难免有错误或者不全面的地方,在此恳请读者朋友批评指正。
关于本书的疑问和反馈可以到本书在GitHub上的项目仓库HelloFlask(https:github.comgreylihelloflask)中创建Issue并提交;书中的错误或笔误可以修改仓库中的勘误文件(Errata.md)并提交Pull Request。
对于示例程序的疑问、反馈和改进建议可以到示例程序在GitHub上的项目仓库提交Issue或Pull Request,具体的网址可以在对应的章节看到。
当然,你也可以直接发邮件与笔者联系,笔者的邮箱是withlihui@gmail.com。
本书的配套资源索引可以在本书的主页http:helloflask.combook上看到。另外,你可以访问笔者的博客(http:greyli.com)或是知乎专栏Hello, Flask!(https:zhuanlan.zhihu.comflask)阅读更多与Flask相关的文章。
致谢
首先,感谢机械工业出版社华章公司的杨福川老师和李艺老师。因为杨老师的信任,才让笔者有幸写作这本书。本书能够顺利完成,离不开两位老师的悉心指导,更离不开其他编辑的辛苦工作。
其次,感谢Flask社区和其他开源项目的贡献者们创造了这一切,也感谢在Stack Overflow、GitHub、Reddit和Wikipedia等网站贡献知识的开发者们。
最后,感谢父母和奶奶这段时间的支持和帮助,也感谢女友魏瑶和弟弟家辉给予的鼓励和陪伴。
|
|