《Flask 入门教程》第二版发布了!新版本主要有以下变化(详见 commit 列表):
- 去掉了 Pipenv 的介绍,改为使用 venv/virtualenv+pip
- 所有提示和注意段落使用引用样式标注
- 修正了大量笔误
- 调整前言和后记内容
- 调整部分措辞
访问本书主页下载 PDF 或在线阅读。
《Flask 入门教程》第二版发布了!新版本主要有以下变化(详见 commit 列表):
访问本书主页下载 PDF 或在线阅读。
如果你用 reveal.js 做幻灯片,你会发现没有合适的翻页笔可以用。具体来说,是没有支持上下左右四个方向的翻页笔。
参加 PyCon China 上海站的时候,因为现场条件限制,不得不用翻页笔,但是发现翻页笔只支持上下翻页,不支持左右翻页,而使用 reveal.js 做的幻灯片常常会包含上下左右四个方向的切换。当时还和其他志愿者说这是个潜在的商机——做一个支持上下左右四个方向的翻页笔。
回来去网上搜了一下,发现真的没有支持四个方向的翻页笔。想想也没有多少人会需要用到四个方向切换。市场份额最大的幻灯片制作软件是 PPT、Keynote 和 Prezi。前两者上下翻页,Prezi 左右翻页,所以有一些翻页笔会支持在「上下」和「左右」两种模式切换,还有一些会支持切换成「PageUp 和 PageDown」翻页模式,用来给 PDF 文件翻页。
接着,我调整方向开始找有没有只有四个方向键的蓝牙小键盘,找的过程中突然想到以前用手柄映射键盘按键来玩一些不支持手柄的电脑游戏,那么 Wii Remote(Wii 右手控制器)也许也可以通过映射按键来当做一个翻页笔用。搜了一些资料,发现真的可以!找到了一个叫做 WiinRemote 的程序来做按键映射(macOS 可以使用 Darwiin Remote,另外还有其他通用的替代选项)。
以 Windows 10 为例,你需要先通过蓝牙把 Wii Remote 连接到电脑,基本步骤如下:
第一次和电脑配对会有些麻烦,后续就可以很容易连接了。
连接成功后打开 WiinRemote 配置按钮。在 Options – Preferences – Button Assign 选项里可以定义按键映射。除了设置上下左右四个方向切换以外,Wii Remote 上的其他按钮也可以利用起来,比如分别用来映射 Enter、Esc 这些按钮。
唯一的缺点就是 Wii Remote 和常见的翻页笔相比有点大……
虽然看起来很完美,但后来我还是采用了另一个替代方案,买了一个支持切换 PageDown 和 PageUp 翻页模式的翻页笔,这样可以让 reveal.js 的幻灯片按照从左到右,从上到下的顺序逐页切换。
也许下次演讲你会看到我用 Wii Remote 来翻页。
P.S. 除了用来当翻页笔,Wii Remote 甚至可以用来实现数字白板、触控屏幕和 3D 头戴显示器(Free or cheap Wii Remote hacks)。
《Flask Web 开发实战》已经出版一年多,书里面的一些彩蛋也不知道有多少被人发现了。再不公开,我可能都要忘了。所以就趁着出版一周年这个契机整理一下吧。
这些彩蛋大都是关于电影的一些双关和文字游戏,有一些说是彩蛋可能会有些勉强。比较正式的一共有 10 个,分别对应十部电影。也就是第三章介绍模板引擎时的实例程序电影清单里列出来的十部电影。
下面按照出现顺序一一剧透。
P14 第一章:初识 Flask 1.3
这一节介绍运行 Flask 程序,章节标题是「Run, Flask, Run!」。
阿甘正传里,当阿甘被欺负的时候,珍妮总会喊「Run, Forrest, Run!」。

P36 第二章:Flask 和 HTTP 2.2.3.3
介绍 URL 规则的 any 转换器时使用的示例如下:
@app.route('/colors/<any(blue, white, red):color>')
def three_colors(color):
return '<p>Love is patient and kind. Love is not jealous or boastful or proud or rude.</p>'
这个并没有什么特殊含义,就是列了三个颜色作为 URL 选项,返回的都是圣经里的那句话。
P76 第三章:模板
第三章在示例程序里的填充数据是整本书所有彩蛋相关的十部电影,作为一个足够显眼的线索。
movies = [
{'name': 'My Neighbor Totoro', 'year': '1988'},
{'name': 'Three Colours trilogy', 'year': '1993'},
{'name': 'Forrest Gump', 'year': '1994'},
{'name': 'Perfect Blue', 'year': '1997'},
{'name': 'The Matrix', 'year': '1999'},
{'name': 'Memento', 'year': '2000'},
{'name': 'The Bucket list', 'year': '2007'},
{'name': 'Black Swan', 'year': '2010'},
{'name': 'Gone Girl', 'year': '2014'},
{'name': 'CoCo', 'year': '2017'},
]
P105 第四章:模板
这一章一开始给出了一个 HTML 登录表单的示例,示例代码和渲染后的画面(图 4-1)中,用户名输入框的占位文字是 Héctor Rivera,密码输入框的占位文字是 19001130,勾选了记住登录状态的「记住我(Remember me)」选项。

Héctor Rivera 是电影里小男孩在亡灵世界里遇到的死去的爸爸,他的生日是 1900 年 11 月 30 日,勾选了「Remember me」,他就会被人记住,所以就不会消失了……
P139 第五章:数据库
第一小节介绍关系型数据库的时候给出了一个示例表格(表 5-1),如下:

这两条数据分别对应《消失的爱人》里的男女主角。
同样在第五章,这一章写了一个用来记笔记的示例程序,分别使用了三条笔记内容作为示例演示 CRUD 操作,即:

这三条笔记均是《记忆碎片》里男主角记在各处的笔记。
P178 第六章:电子邮件
第六章介绍电子邮件使用的示例邮件正文是「Across the Great Wall we can reach every corner in the world.」。这是 1987 年从中国发出的第一封电子邮件正文。
本来是想把 Wall 换成另一个单词以便反映现状的,但是出于安全考虑,没那么做。不过这句话原版现在来看已经是够讽刺的了。
P246 第八章:个人博客
介绍自定义 flash 消息样式的时候,给出了下面的自定义 CSS 类示例:
.alert-matrix {
color: #66ff66;
background-color: #000000;
border-color: #ebccd1; /* 这一行好像没用 */
}
调用示例如下:
flash('Knock, knock, Neo.', 'matrix')
实际的显示效果如下所示:

模拟了电影原图:

P236 第八章:个人博客
这一章的示例博客名字叫做 Bluelog,模仿了《未麻的部屋》里记录未麻生活的网站,初始化账户的信息如下:
def fake_admin():
admin = Admin(
username='admin',
blog_title='Bluelog',
blog_sub_title="No, I'm the real thing.",
name='Mima Kirigoe',
about='Um, l, Mima Kirigoe, had a fun time as a member of CHAM...'
)
...
另外介绍博客的主题地方提供了蓝色和黑色两个主题,主题名分别是「Perfect Blue」和「Black Swan」,对应《未麻的部屋》和《黑天鹅》两部电影的英文名(后者致敬了前者)。
P260 第八章:个人博客
这个算不上彩蛋……在介绍生成英文标题 slug 的 slugify 函数的时候,实际调用的示例使用了龙猫的几种名字作为输入数据:
>>> slugify(u'My Neighbor Totoro') u'my-neighbor-totoro' >>> slugify(u'邻家的豆豆龙') u'lin-jia-de-dou-dou-long' >>> slugify(u'となりのトトロ') u'tonarinototoro'
P421 第十章:待办事项程序
这个彩蛋是刻意加的,因为这一章的示例程序是一个 Todo List 程序,所以要找一个和清单相关的电影。示例程序里的几条待办事项就是电影里的一些遗愿。当时还没看过这个电影,特意去看了一遍,感觉一般。

应该就这些了,如果还有其他的,欢迎补充。
那么放置这些彩蛋的目的是?没目的……仅仅就是为了好玩。同时为了能让发现彩蛋的人也会觉得好玩。
这是在 COSCon(中国开源年会)2019 上海 11 月 2 号分会场 1(开源社区与项目) 下午 2:20 开始的演讲《一个野生程序员的开源故事》的介绍和相关信息。
和标题透露的信息一样,这不是一个严肃的演讲(虽然 COSCon 看起来是一个很严肃的大会)。这是今年的最后一个演讲,明年不会弄那么多了,太累了……
购票和日程:https://www.bagevent.com/event/5744455

一个野生程序员的开源故事
介绍其实可以忽略,因为根据前几次的演讲经验,演讲内容通常都会和简介有很多出入(跑题)。下面是简介:
2016 年,李辉开始学习 Flask。两年后,他加入了 Flask 开发团队。这中间发生了什么?其中大量的开源贡献起到了什么样的作用?参与开源对编程能力提高、个人品牌建设甚至是求职有哪些帮助?在本议题中,这些问题将会一一得到解答,你还会了解到如何踏出开源贡献的第一步,并且学到一些小技巧,比如参与开源涉及的英语和 Git 问题。
面向的听众:编程初学者,编程爱好者,程序员等想要参与开源的人。
待补充
这是我在 COSCUP 2019 第一天下午的演讲,主要介绍了这两年的经历和一些经验,內容偏娱乐向(本来想说内容很水,但又想到在台湾「很水」就是「很强」的意思……)。有时间会写一篇文章记录参加 COSCUP 的经历和感想。
对于录像内容的一些备注:
2016 年,我开始学习 Flask,并尝试为多个开源项目贡献代码。两年后,我加入 Flask 开发团队,并出版国内第一本 Flask 书《Flask Web 开发实战》。这中间发生了什么?除了运气的帮助,我做对了哪些事情,经验是否能被复制?其中大量的开源贡献起到了什么样的作用?在本议程里,我会从我的自身经历出发,在编程学习、个人成长、开源贡献、技术写作等方面分享一些经验和思考。如果你想高效学习一门新技术、参与开源贡献、建立个人品牌、或是写作一本技术书,这些信息或许能够给你带来帮助。
总体效果还不错,现场氛围很好,有很多人喜欢。另外因为这是第一次拿到完整的演讲录像,自己看了一遍,总结了一些问题:
感谢 COSCUP 的 Bob Chao 帮忙协调提前拿到录像,感谢开源社的刘天栋老师帮我找到李思颖老师,感谢李思颖老师帮我找到 Charon,感谢 Charon 帮忙处理视频。不过我最后还是用了自己剪辑的那一版视频(嘘)。
这是在 PyCon China 2019 上海场 9 月 22 号上午九点开始的 Tutorial(实践课程)《Python Web 开发第一课》 的介绍和相关信息。
购票链接:https://www.bagevent.com/event/5886131(Tutorial T3,优惠码 hellogrey)
Python Web 开发第一课
这是一个面向 Python 程序员的 Web 开发课程,目标听众需要对 Python 基本语法有一定的了解,但对 Web 开发的了解程度没有要求。
在这个课程里,我会将 Python Web 开发所涉及的相关概念进行一个系统的梳理和介绍,包括 HTTP 协议、前端基础知识、常用的 Python Web 框架以及其他各种工具。
这个课程还会包含一个动手编程的环节。我会从最让人头疼的开发环境搭建开始,一步一步教你如何使用 Flask 开发一个简单的 Web 程序。
在课程过后,参与者会对整个 Python Web 开发技术栈有一个全局认识,并掌握基本的 Web 开发知识,而且会对接下来的学习路径有一个清晰的了解。
时长:三小时
一、基本概念
二、动手编程
三、Q&A
初级
李辉,Flask 等相关项目的维护者,《Flask 入门教程》和《Flask Web 开发实战》的作者,HelloFlask 社区创建者。他撰写过大量技术文章,回答过大量技术问题,在这个过程中积累了一些编程教学的技巧,擅长用简单的语言解释复杂的编程概念。你可以在他的个人网站 greyli.com 了解到更多相关信息。
成都场 2.0 版本(推荐)
上海场 1.0 版本
这是在 PyCon China 2019 上海场 9 月 21 号分会场 B 下午 1:30 开始的演讲《基于 Flask 的 REST API 开发指南》 的介绍和相关信息。
这场演讲也会参加 PyCon China 2019 成都场(10 月 26 号)。
基于 Flask 的 Web API 开发指南
作为一个微框架,轻量灵活的 Flask 很适合用来开发 Web API。相对于 Django REST Framework 和 APIStar,Flask 有什么优势和缺点?为了减少工作量,我们通常会使用一些工具来辅助编写,面对 Flask-RESTful、Flask-RESTPlus、Flask-API、Webargs、Marshmallow 等扩展和工具库,我们应该如何选择?虽然我们经常使用 REST API 这个名称,但是大部分的 API 都不够 RESTful,那么什么样的 API 才能算是 REST API?在这个议题中,我们将对这几个问题逐一进行探讨,并了解如何使用 Flask 编写出功能完善的 Web API。
尽管完成了两版,但是比预先计划的内容少了很多,没能完成 Flask 扩展和其他 Web API 框架的深入对比。这些估计要放到新书里了。
这是在 PyCon China 2019 上海场 9 月 21 号分会场 B 下午 4:40 开始的闪电演讲《Python 虚拟环境和依赖管理工具大乱斗》(时长限定 5 分钟以内) 的介绍和相关信息。
PyCon China 2019 上海场购票链接:https://www.bagevent.com/event/5293611(优惠码 helloflask)
Python 虚拟环境和依赖管理工具大乱斗
大多数人都会在 Python 虚拟环境和依赖管理的路上经历重重困难。一开始,你使用 pip + virtualenv + requirements.txt 的工具组合,或者再加上 virtualenvwrapper;接着,更高级的新东西出现了。Pipenv 号称新一代 Python 项目环境和依赖管理工具,打算替代上面的复杂组合,但是发展并不顺利;接着,竞争者出现了,其中实力最强的 Poetry 除了可以替代 Pipenv 来管理依赖之外,甚至还可以让你不用写 setup.py。故事就这样结束了吗?当然没有,尚在草案阶段的 PEP 582 在一边虎视眈眈,试图终结这一切混乱……
加上写相关研究文章的时间,一共花了 36 小时来准备这个演讲(5 分钟),整体效果还不错,后半部分时间太紧说的有点快。
另外最后几天太忙(懒),有几处幻灯片页面样式都使用了行内 CSS,暂时没时间改,就这样吧 :/
有没有人要参加今年的 PyCon China 上海场(9/21)?欢迎一起来组团(加我微信,备注「PyCon 组团」)!我们到时可以一起见面交流,也可以做一些 Flask 相关的活动。Flask 作者 Armin Ronacher 和 Flask 维护者之一 Hsiaoming Yang(lepture)已经确认出席,到时我可以把他们俩拉来和大家一起聊天(英语不好没关系,会说 how do you do 就行)~
其实参加技术大会并不一定是要去学东西,也可以去交朋友,换工作(微软、AWS、Elastic、JetBrains 这些公司不考虑下么),找男/女朋友(没错,我们会有相亲墙,而且 PyCon 是有女生报名的,有多少暂时保密),感受技术氛围(假装会让自己变得更厉害)……
我从 PyCon 会务那里申请到三个优惠码,helloflask 可以让大会票减掉 100 块,hellopython 可以让所有 Tutorial(三小时一个的课程)打七折,hellogrey 可以让我的那个 Tutorial(T3,Python Web 开发第一课)打六折。每个优惠码各有 20 个名额。
大会购票和详细日程见 https://www.bagevent.com/event/5293611
大会官网在 https://cn.pycon.org
在所有主题演讲中,我比较期待(和能听懂)的大概有下面这几个(主要都在分会场 B):
除此之外,还有好几个分会场大概 30 个演讲,包括语言特性、人工智能、微软专场、基础架构、创新领域。另外 AWS 还提供了一个 Workshop,具体日程和演讲介绍见这里。
闪电演讲(5 分钟一场)是今年我参与组织 PyCon China 后推动添加的新环节,我也会负责闪电演讲的主持(第一次做主持人……紧张 ><)。闪电演讲会在分会场 B(Web 专场)进行,下午 4:40 开始,是独占环节。如果你参加今年的 PyCon,一定不要忘记来这里。
今年 Tutorial 的设置主要参考了 PyCon US,形式是三小时的收费实践课程(单独收费,在 9/22),由《流畅的 Python》作者的两个 Tutorial 打头阵,而微软贡献了一个免费的 Tutorial。
我的 Tutorial 是一个面向 Python 初学者的 Web 开发入门课程(T3:Python Web 开发第一课),动手实践的部分会使用 Flask,欢迎参加。另外,Flask 维护者之一 Hsiaoming Yang 也有一场面向初学者的 Tutorial(T6:从零开始打造一个 Python 开源项目),详情见下面的链接。
Tutorial 详细日程和购票:https://www.bagevent.com/event/5886131
别忘了用优惠码,我的那场(T3)可以用 hellogrey 优惠码,其他的 Tutorial 可以用 hellopython 优惠码。下面是我的 Tutorial 介绍:
介绍
这是一个面向 Python 程序员的 Web 开发课程,目标听众需要对 Python 基本语法有一定的了解,但对 Web 开发的了解程度没有要求。
在这个课程里,我会将 Python Web 开发所涉及的相关概念进行一个系统的梳理和介绍,包括 HTTP 协议、前端基础知识、常用的 Python Web 框架以及其他各种工具。
这个课程还会包含一个动手编程的环节。我会从最让人头疼的开发环境搭建开始,一步一步教你如何使用 Flask 开发一个简单的 Web 程序。
在课程过后,参与者会对整个 Python Web 开发技术栈有一个全局认识,并掌握基本的 Web 开发知识,而且会对接下来的学习路径有一个清晰的了解。
流程
一、基本概念
二、动手编程
三、Q&A
内容难度:初级
目标听众
听众要求
给 PyChina 做了一个新主页,地址在 https://pychina.org。它原来的名字叫「蟒中国社区」,听起来很有意思,不过这次改用了更正式的「Python 中国社区」。
把自己的目标公之于众,有可能会因为受到监督而更容易完成目标,也有可能会让你潜意识里感觉自己好像已经完成了目标,从而让计划更难执行。我更相信前一种理论,所以决定现在公布第二本 Flask 书的写作计划。
尽管我很想早一点深入学习更多的东西,而不是局限在 Flask(或 Python) 领域,但事实是,在这一个领域就已经有太多的东西需要研究和学习……目前来说,我最想解决的就是 Web API 的编写问题。《Flask Web 开发实战》虽然在第十章介绍了 Web API 的大部分基础概念,但是只实现了一种 OAuth 认证流程,也没能深入更多内容,包括数据校验、请求封装等。因此,我决定再写一本书来覆盖这个主题。
另一个原因是,我在上一本书的电商页面、豆瓣条目还有其他地方收集到了一些批评,其中有一些很中肯,所以我想写一本更好的 Flask 书。除了克服这些批评里提到的缺点,我也会尝试更科学的写作方式,不会像上一本书那样在早期印刷版本包含那么多的笔误和疏漏。
作为试水,我在 PyCon China 2019 上海场会有一个相关主题的演讲:《基于 Flask 的 Web API 开发指南》,如果你感兴趣的话,可以考虑报名参加。
不同于《Flask Web 开发实战》所追求的大而全,这本书的定位是一个小而精的 Flask 书。它会包含下面这几部分:
这本书一来可以衔接《Flask 入门教程》,二来可以补充《Flask Web 开发实战》没有覆盖的内容。当然,对于学习 Flask,囊括几乎所有相关主题的《Flask Web 开发实战》仍然是一个不错的选择。
对于相同的主题,我会考虑使用不同的工具,比如《Flask Web 开发实战》里单元测试使用 unitttest,那么这本书就会介绍用 pytest;上一本书里编辑器介绍使用 PyCharm,这一本书或许就会介绍使用 VSCode。
下面是这本书的其他具体设计:
作为后续,在这本书完成后,我计划写一本电子书来介绍如何使用 Vue.js 基于这本 Flask 书编写的 Web API 来开发客户端。尽管我现在还没入门 Vue.js……但是我已经把放相关内容的网站域名准备好了:HelloVuejs.com(它和 HelloFlask.com 是兄弟域名 :p)
预计的发售时间是明年愚人节,即 2020 年 4 月 1 日。因为 Flask 的诞生时间是 2010 年的愚人节,所以明年愚人节会是 Flask 诞生十周年纪念日,一个很完美的发售时间。
如果你对这本书感兴趣,可以关注我的微信公众号、Twitter 和豆瓣账号获取最新动态,或是访问这本书的主页。
2020/4/1 更新:Flask 新书完成时间推迟
在公开上一本写作消息的文章里,我征集到了大约 40 条建议,虽然没能完全采纳,但我都一一考虑过这些很有价值的建议。对于这本新书,在内容、形式或是其他任何方面,你有什么意见和建议?欢迎发评论分享你的想法,谢谢。
在 Python 诞生 30 周年之际,PyCon China 2019 将于 9 月 21 日在上海(主会场)举行,今年我们设置了闪电演讲和 Flask 专场,正在征集相关议题。
如果你对演讲不感兴趣,但是想购票参加,可以直接跳到文章结尾。
5 分钟能做的事情很多,但是你有没有想过用这 5 分钟在技术大会上进行一场闪电演讲?如果你有些心动的话,现在就一个这样的机会放在你面前!
尽管只有 5 分钟,你仍然需要做足准备。反过来,5 分钟并不短,足够让你完成一场让人记忆深刻的精彩演讲。
不用担心自己「资历」不够,因为我们只关心你的演讲内容是否有趣和有质量;也不用担心自己没有演讲经验,因为我们将在会前进行一系列线上培训和交流,帮助你完成几次试讲并给出相应的建议和指导。
无论你最终是否提交议题,只要你感兴趣,都可以加我的微信(备注「闪电演讲」),我会邀请你加入微信交流群。
除了策划闪电演讲,我还负责策划一个 Flask 专场。如果你在 Flask 方面有过丰富的探索和实践,想和大家分享你的知识和经验,欢迎报名。当然,如果你想分享的内容和 Flask 无关,但和 Python 有关,也欢迎报名。
总而言之,只要你的演讲和 Python 有关,并且内容不算无聊,那就大胆提交你的议题吧!
点击下面的链接即可提交议题申请:
报名的城市会场不限上海,报名将在 8 月 10 号截止,如果你申请的是闪电演讲,记得在「演讲类型」选项里勾选对应选项。
如果你的议题成功入选,除了可以在 PyCon China 2019 大会上分享你的想法外,你还可以获得下面的福利:
如果你对演讲不感兴趣,那么报名参加大会也是一个不错的选择,点击下面的链接购买上海场门票(早鸟票 7 月 30 号截止):
https://www.bagevent.com/event/5293611
在这里,你将有机会交到穿着同款格子衬衫而且使用 Python 的朋友,还有机会和很多 Python 技术大牛小牛们面对面交流。我邀请到了两位 Flask 领域的重量级嘉宾,一个是 Flask 的作者 Armin Ronacher,另一个是 Flask 的维护者之一 Hsiaoming Yang(lepture)。Flask 目前的核心维护者 David Lord 虽然没能成行,但是表示可以远程支持 Sprint 活动。
如果你离上海太远,也可以考虑参与其他会场,比如北京、杭州、成都、深圳等等,具体议程可以关注 PyChina 公众号或 PyCon China 官网。
PyCon China 2019,期待你的参与!