2025-11-23 22:25:36
经过五年的写(拖)作(延),我的新书《Flask 从入门到进阶》终于出版了!作为《Flask Web 开发实战》的全新升级版,新版本在原书的基础上进行了大量更新和调整,以便适应当下的技术栈。目前已经有现货可以购买:
至此我在 Flask 这条人生支线的探索也算圆满了。我从大二自学 Python 和 Flask,毕业前开始写作《Flask Web 开发实战》,这本书出版的同时也成为了 Flask 的维护者,并且为大量相关项目贡献代码。从 2018 年出版到现在,一共重印了 14 次,累计售出 2 万本(包括电子书)。收获了很多好评,在豆瓣上评分也保持在 9 分左右:
到现在终于完成了新版本,而且还拿到了 Armin Ronacher(Flask 作者)的推荐语:
Great resources make great developers, and it’s wonderful to see Flask supported by such high-quality education materials.
感谢一直关注这本书并持续催更的朋友!这本书的完成是我们共同努力的结果 :D
这本书换了一个新书名,出于一个有点滑稽的原因。书名从《Flask Web 开发实战:入门、进阶与原理解析》变成了《Flask 从入门到进阶:Python Web 开发工程化实践》。不过新的副书名也能更好的概括这本书的特点:以学习 Flask Web 开发作为脉络,你能通过这本书掌握相对完整的 Python Web 工程化实践。从 HTTP 原理到数据库 ORM,从单元测试到代码风格再到性能优化,从 Web 程序开发到 Web API 开发,最后再到不同的部署方式。如果想要深入了解框架,最后还有一章源码解析。同时用两个示例程序串起来各种不同的知识点,比如 Flask 项目的组织方式和技巧,以及 Flask 开发中各类功能的实现。
访问这本书的主页查看详细介绍和章节目录:https://helloflask.com/book/4/
下面是一些具体内容上的变化:
| 旧版本 | 新版本 |
|---|---|
| Flask 1.x | Flask 3.x |
| Python 2.7, 3.6+ | Python 3.9+ |
| Bootstrap 4.x | Bootstrap 5.x |
| SQLAlchemy 1.x | SQLAlchemy 2.x |
| 旧版本 | 新版本 |
|---|---|
| Pipenv | PDM |
| Flask-Mail | Flask-Mailman |
| Flake8 | Ruff |
| Open Iconic | Bootstrap Icon |
| Flask-Moment + Moment.js | Day.js |
| jQuery | Vanilla JS |
| AJAX with jQuery | Fetch API |
| Flask for Web API | APIFlask |
| 云平台部署 | Docker 部署 |
示例程序上做了比较大的调整,删掉了旧版本的 SayHello、Todoism、CatChat,保留两个程序并做了比较大的重构:
| 旧版本 | 新版本 |
|---|---|
| Bluelog | Greybook |
| Albumy | Moments |
| helloflask/demos | helloflask/examples |
新版本计划是想做一些删减,比如从 700 页减到 500 页,毕竟一本厚书还是让人蛮有压力的。虽然删掉了两个章节,但是写到最后又快到了 700 页,实际的厚度比旧版本还要厚一点点。大概不知不觉又加了很多内容进来。
本书面向的读者群如下:
本书不包含对 Python 的基础知识介绍,所以读者需要事先对 Python 基本语法有一定的了解。另外,Web 开发不可避免的会涉及到一些 HTML、CSS 和 JavaScript 知识,如果你不熟悉这些,可以通过 MDN 提供的 Web 开发入门教程学习,简单了解即可。
Great resources make great developers, and it’s wonderful to see Flask supported by such high-quality education materials.
—— Armin Ronacher(Flask 作者,Sentry Platform 副总裁)
作为一名对 Python 充满热忱的软件工程师,一名乐于帮助他人、回馈社区的布道者,Grey 对技术准确性、阅读体验感的无限追求都体现在这本新作中,我相信每一名读者都能在字里行间感受到他的诚意。
—— 管俊(《DevOps 实践指南(第 2 版)》译者,戴尔中国卓越研发集团 DevOps 架构师)
这本书内容翔实,推荐给想要系统学习 Flask 的人。不要漏掉书中的小知识点哦。
—— Hsiaoming Yang(Typlog 创始人,Authlib 作者)
我是李辉(Grey Li),Flask & APIFlask 的维护者,Flask 开发团队(Pallets Team)成员, HelloFlask 社区和代码厨房社区创建者,微软 Python 方向最有价值专家(MVP)。目前就职于戴尔中国卓越研发集团,担任首席软件工程师。
我热衷于开源软件的应用和推广,为 Flask 等开源项目贡献过大量代码。也曾在 PyCon China、PyCon US、COSCUP、COSCon、CommunityOverCode 等技术大会担任演讲嘉宾。你可以在 GitHub 上看到我的开源项目。
如果你想了解我的新作品或其他动态,可以关注我的 Twitter 和微信公众号,或是加入我的邮件通讯列表。
在阅读过程中如果发现了排版或内容上的错误,欢迎通过下面的方式提交勘误。我会在后续重印时进行修正。感谢反馈!
如果你觉得这本书还不错,欢迎分享到社交网络,或是告诉你的同事和朋友。也欢迎在本书的豆瓣页面标记和评价。
2025-10-17 18:58:36
五年了,终于等到这一天。《Flask Web 开发实战》的全新升级版《Flask 从入门到进阶:Python Web 开发工程化实践》将于下个月正式发售。和上一版一样,先来预售作者签名版。
签名版的价格和上一版保持一致,依然是 109。付款方式和详细说明可以访问预售页面查看:
https://helloflask.com/book/4/signed/
签名版除了送 2 张 Flask 贴纸,还会额外送一张我的名片,可以用来当书签或者飞着玩。具体发货时间取决于正式发售时间,虽然不能完全保证,但我会尽量让签名书第一批发出。
你也许好奇为什么要换一个新书名,而不是作为第 2 版出版,即《Flask Web 开发实战(第 2 版)》。我设想了一些合理解释:因为内容变动比较多,换个更贴切的书名;在副书名里加一个 Python 关键字,更容易被别人搜索到……但背后实际的乌龙是:管理书号的工作人员在录入系统时打错了名字,把《Flask Web 开发实战》写成了《Flash Web 开发实战》。
按照出版规定,如果我想作为原书第 2 版来出版,那么新书名就只能叫《Flash Web 开发实战(第 2 版)》了。诸位应该也不想学 Flash Web 吧?
2025-10-13 21:12:29
即将出版的新书(预计将于本月底发售)变成了一个超强 deadline,它提及的所有东西都要在发售前成为现实。比如写进书里但其实还不存在的 APIFlask 3.0.0 版本,以及这个可以被当作先导材料的《Flask 入门教程》。
面向 Flask 2.x 的旧版本当然没法作为先导材料,所以断断续续花了 26 个小时完成了第 4 版的更新。新版本主要有下面这些变动:
另外正式加了一章介绍为什么以及如何为本书付费,取代了主页上自愿点击的「付费支持¥10」按钮。考虑到整本书内容完全公开,所以没法阻止读者逃票,但至少我已经克服了「伸手要钱」的羞耻。对于在工作之外挤出的这些时间,我需要一些正反馈。这样可以让自己更认真维护下去,也不会产生怨念。不仅是获得收入,有时还会收到读者的附言感谢,这给我的生活里带来了很多随机的开心时刻。
写新版本的过程中有时也会想,现在跟 AI 说一句「帮我用 Flask 写一个 Watchlist 程序」就大概能实现的程序,还有人愿意来读教程吗?我想至少,在通过教程来学习编程可以让你说一句「我真厉害」,而不仅仅是一句「AI 真厉害」。
另外这个教程最早是在 2019 年发布的,六年过去了,部署章节介绍的 PythonAnywhere 的 UI 和功能基本没有任何改变。我只需要更新 Python 版本选择那个页面的图片,其他部分不需要任何改动。有一种值得托付终生的感觉。希望可以做出来有这样品质的产品和作品。
最后附上相关链接:
2025-08-26 19:09:03
七月底,因为 SendGrid 不再提供免费额度,我开始寻找替代服务。在给 greyli.com 这个域名配置新的邮件服务 DNS 的时候,某些原因一直没成功。尝试过程中手贱把已有的几条邮件相关的 MX 和 CNAME 记录给暂停了。
一个月后的今天,发现注册某个服务总是收不到验证码,这时才发现我当时是把 [email protected] 的邮箱服务的 MX 记录给暂停了。整整一个月没法收到邮件,我太蠢了。
如果哪位朋友在这一个月内(2025/7/25 – 2025/8/26)给我发了邮件,请不要恨我,我只是没有看到。如果可以的话,麻烦再重新发一遍吧。
2025-07-05 11:43:40
家西边有一条小河。水源从山上来,经过幽深的地下,一路到这里,从一个废弃的水闸流出来。冬暖夏凉,清澈幽静。
对村里人来说,它叫「洗衣沟」。大人们常常聚集在这里拿着棍子敲打衣服。洗衣粉的袋子随手丢在河边。夹着土,叠了一层又一层。
对那时候的孩子们来说,这里是一个游乐场。在高高的水闸台子上往下扔石头。用石块在水里筑起小小的水坝。在河两边挖一些黄色的黏土,然后坐在台子上玩泥巴。黏土摔在粗砺的水泥台子上,常常会粘起一些半透明的小石子。于是我们做出来水晶手枪、动物和坦克。玩够了之后再还给土地。
过年的时候,我们会往水里扔鞭炮。除了普通的炮和有塑料外壳的「鱼雷」,印象最深的是一种在爆炸之前会旋转发光的炮。只在一家小店可以买到。据说是从经过国道的货车上掉下来的一箱炮,包装上是看不懂的英文。它在水下旋转,闪出五颜六色的光。光透过水变得缓慢而绚烂,像是发生在另一个世界的景象。
我们家买了洗衣机的时候,邻居们都过来参观。后来村子里的洗衣机越来越多,去河边洗衣服的人越来越少。偶然会见到有人去洗冬天的棉衣或是工厂的工服,总之是太脏太费水的东西。不管怎样,洗衣沟的水还是那样清澈,不知疲倦地流淌着,只不过岸边和洞深处多了很多水草。水草越长越多,直到占领了所有空白的水域。
再后来,河的右岸开了一家养鸭场。他们修了一条管道,把粪便排进河里去。下游的鱼塘主不愿意了,争执不下,就在上游用推土机筑了一个大坝,把整个河流硬生生地截断。人们在河边扔的垃圾也越堆越高。有人把成堆的蒜苗倾倒在这里,沤烂后发出难闻的味道。小河无聊的时候,也许会计算距离下一次建设美丽乡村还要多久。而它没想到的是,先等来的却是一场谋杀——左岸的砂石场经过一次扩建,把水闸连同河流都填平压在土下。他们需要可以挣钱的土地,不需要一条无用的河流。
面对垃圾、粪便、切割和覆灭,河流能做什么呢? 它什么也做不了。面对人类,它只是一个被征服和战胜的对象。
不会再有大人一边洗衣服一边大声地聊天。也不会再有孩子在那里玩水和泥巴,放鞭炮,用树叶叠出能舀水的勺子。
我在电脑里翻了很久,终于找到三张拍摄于 2013 年左右的照片。翻照片的过程里,我想到小学暑假住过的、散发着臭水沟气味的望京城中村,还有高中学校旁边短暂住过的小村子。再次想起的时候才发现它们已经全都不见了。
它们变成梦的河流,不再滚烫,也不再转动,只剩下空白。
#清空草稿箱计划# 原文创建于 2023 年 2 月 6 日,过年回家发现小河不见了。标题灵感来源于伍佰 & China Blue 的《梦的河流》。
2025-06-28 11:52:14
每一次的游记都拖到放弃。从 19 年第一次去台湾,到上次去日本,每次都想着记录一下,最后都不了了之。我想这一次一定要完成这篇游记,毕竟这是我去过最远的地方。
看到微软 MVP 峰会奖学金(scholarship)邮件的时候是在去年十二月初的某个工作日。中午花了一个小时的时间来写申请表,当时心想应该没几个人会这么认真写申请吧——后来发现果然我是中国区唯一拿到奖学金的人。这是微软第一次开放 MVP 奖学金项目,提供了最高 2500 美元的机票和酒店费用支持。这基本覆盖了这次美国行的主要开销,非常感谢微软。
收到奖学金申请通过的提醒邮件已经是一月末,距离三月末的 MVP 峰会剩下两个月时间。这时去美国还缺少最关键的东西——签证。现在看来申请签证的整个过程极其曲折:
在经历了各种忐忑和焦虑,以及无数次地刷新、登录和等待后,终于在北京通过了面签。走出大使馆回酒店的路上,心情好极了。一切终于重归平静。如果这次还没有通过,我很难对自己解释这两个月的折腾是为了什么。
最终我在出发前一周拿到了签证。接着在临出发当天的上午拿到了送给美国朋友的伴手礼,出发去机场前一小时去顺丰快递站提前拦截了为这次行程赶制的英文名片。总之在各种混乱和拖延中,完成了全部准备工作。
上海直飞西雅图需要 11 个小时,长途经济舱很难熬于是三部电影连连看。下飞机的第一印象是——美国的咕咕好大好勇敢,旁若无人地在人行道上散步。在机场迷路了一阵,在工作人员的提示下,终于在机场一侧的出口找到了公交站台。第一次上车前不确定要买哪一种类型的票,问了司机,司机直接让我上车,说不用买了。就这样,继续展开我的美国自由(免费)行。
第二印象是,这里的人大都很有礼貌且友善。坐公交的时候几乎每个人下车前都会和司机说一声谢谢。之后的几天基本也都是这样的体验:路边的车会提前停下来等你过斑马线,司机微笑着示意你先走。在商场里,店员会主动和你微笑打招呼。车站里的工作人员会和你说早上好。在远离市区的地方走路,有时迎面走过的陌生人也会和你打招呼。我甚至在想,是不是因为人太少了。如果不对彼此热情一点,就会感到太孤独。
在第一次面签的时候,我发现没有好好准备的话很难一下子说清楚微软 MVP 是什么,我和微软是什么关系,以及为什么微软要邀请我去美国参加这个会议。
微软 MVP 的全称是 Microsoft Most Valuable Professionals(微软最有价值专家)——是微软在全球范围内给一些对微软技术或开源社区有突出贡献的人颁发的奖项。我在 19 年成为微软 MVP,也是国内第一个 Python 方向的微软 MVP。
微软 MVP 峰会可以理解为全球微软 MVP 的大聚会。微软 MVP 峰会每年都会在西雅图的微软总部举办,这里会有各种编程技术和微软产品相关的分享,可以和微软产品组面对面交流和讨论。虽然我在六年前就成为了微软 MVP,但是考虑到去一趟美国是笔不小的花销,所以一直没有线下参加。今年有幸拿到了参会者奖学金,第一次线下微软 MVP 峰会终于成行。
我住的酒店在 Bellevue,临近西雅图和微软总部所在的 Redmond。而且酒店刚好在轻轨旁边,坐到微软总部不到 30 分钟。那几天每天上午九点出发,下午五点左右回来。感觉像是在微软上班。
因为是签了保密协议的内部活动,所以参会的具体内容没法分享。峰会一共三天,前后两天也会有一些产品组的活动可以参加。活动类型有很多,比如演讲、讨论会、见面会、剧场分享、园区游览,加起来一共有 400 多个 session。你可以提前在网站上查看和规划所有想去的 session。因为我对微软技术了解得并不多,所以选的议题基本都和 Python、GitHub、VS Code 相关,或是其他非技术相关的话题和活动。这几天也学到了很多活动组织相关的经验,也许未来办代码厨房活动的时候可以用得上。
微软的园区很大,去不同的楼经常需要搭摆渡车。会议的氛围很好,大家都很有热情。不过我英语一般(在美国的几天,多次立志学好英语),听着演讲经常不知道为什么大家都笑了起来。吃的东西也很丰富,每一餐都有不同类型的食物。
如果你在开源和技术社区有一些活动和贡献(包括写书和博客。不一定要和微软技术相关,也可以是 AI、Python 等领域),欢迎联系我,我可以帮忙提名。
微软 MVP 除了可以去微软总部参加每年举办的微软 MVP 峰会之外,还有很多福利。大致列一下:
可以通过邮箱 [email protected] 联系我,或者在领英或 Twitter 上发消息给我。
最好附上一个简单的自我介绍,如果有简历就更好了。
在微软 MVP 峰会这几天收获了一些奇妙的缘分。第二天结束是 Networking Mixer 活动,和第一天下午面向 Developer Technology 分类 MVP 的 DevTech Social 不同,这次是所有 MVP 都可以参加的社交聚会。地点在 4 号楼,一楼很大,整层楼散布着各种食物和酒水,而且到处都是人。入场会拿到一个 Bingo 游戏的卡片,用来集章抽奖。卡片上列满了微软产品组的名字,你需要找到分散在各处的对应产品组的员工给你盖章。同时在找的过程里可以品尝各种食物。
在找和吃的过程中,我接连碰到一个德国人——第一天午饭和他坐在一起闲聊了几句。直到第三次碰到他,我们都觉得缘分太深,于是就结伴起来。我们一起聊天一边找吃的,吃得差不多了就去四号楼外面的微软 logo 拍照。他说因为担心流浪汉问题,所以来美国几天一直没敢坐公共交通。我安慰他说没有的事,电车上干净人又少,公交上大家也很友善。顺便教了他怎么在手机上买票。本来打算一起去坐轻轨回 Bellevue,结果走到一半下了雨,他要回去打车,我就把剩下的最后一件伴手礼送给他,然后道了别。
中国区有十几位 MVP 来参加会议。其中有一位 KOKO 是台湾的 MVP,偶然和他聊起来才发现他在 19 年的时候听过我在 COSCUP 的那场演讲。啊,命运的奇妙连线。
到美国的第二天刚好是瑶瑶生日,在西雅图闲逛的时候想寄一封生日贺卡回家。看地图已经在附近却怎么也找不到邮局。这时一个美国人急匆匆地走过来问我知不知道邮局在那里,我说我也正在找。沿着街走了一段,最后我们一起找到了邮局。寄完贺卡在海边公园拍照时,一个没穿上衣的肌肉猛男刚好入镜,他看到我在拍照就顺势摆了一个 pose,然后对着我微笑。我也给他竖了大拇指。作为一个喜欢和陌生人聊天的人,很喜欢这样的氛围。
到美国的第二天在西雅图玩了一天。买了 City Pass C3,类似景点联票,$120 左右。三个景点组合我选了玻璃艺术馆+太空针塔+华盛顿湖游船。玩下来发现很像浦东美术馆+东方明珠+黄浦江游船。骑共享滑板车转来转去,心情放松,但也有点冷。本来以为从 70 号码头骑车赶到 55 号码头已经够冷了,结果差点冻死在游船上。
很喜欢海边的小公园。在公园的长椅坐着,低头看到地上写着一句诗:“I’m the captain of my soul”,一边念着一边抬头看到广阔的海和天空。
除了这几个景点,其他时间都在到处乱逛。作为路上观察学入门者,尝试发现和理解各种不同的东西。这里的电车和公交车对自行车很友好,公交车车头有可以展开的自行车支架,电车有专门空出的自行车位置。公交车还可以向路边一侧倾斜车身,让老年人更容易跨上台阶。这里的鸟很多。居民区有各种好看的小房子。市中心某些街道上有流浪汉和吸了毒在「挂机」的人。
闲逛中拍到的最满意的照片是下面这张:
第三天峰会下午的分享不太感兴趣,就去逛了微软商店。用半价折扣买了一个 Xbox 手柄,然后坐车去华盛顿大学看樱花。华盛顿大学门前是一大片草坪……写到这想起来实际上它没有大门也没有围墙。没有用来人脸识别和刷身份证的门禁,没有身份证放上去之后一句“无权限”的大声播报。没有打量和禁止你的保安。没有预约入校的申请表。你可以径直走进图书馆,拿起一本书看,不用担心自己是否被允许。
说起来我每天都坐的轻轨——连接西雅图大都市区的 Line 1&2——也没有门。每个站会有下图这样的一个入口,可以在两边刷手机付钱,上面提示语写着「付费进入」。因为我都是在 Transit App 上买日票($2),所以也不用刷。车站会有 1~2 位工作人员,但在那里的一周都没有人查我的票。没有被预设为坏人的感觉真好。
总体来说是很放松的一周。自然环境让人舒服。城市里没有丑陋的标语和宣传画。人很少,动物很多。大部分人的精神面貌是健康和自信的,也许他们没有太多愤怒和恐惧。
在制定旅游计划的时候,我列了一些想要体验的事情,有一条是看电影。在旅游这件事情上,相比于作为游客参观景点,我更喜欢体验本地人的日常生活。所以我经常随便在地图上找个地方,或是跟着公交车坐下去,在某个随机的站点下车。
在周二打折日订了票,只花了 $7。电影是最近拿了奥斯卡金像奖的《Anora》。电影院在 Bellevue 市中心。取票后买了点吃的,然后就直奔影厅——电影院也没有人检票。和国内准时开始不同,电影开场后还要再看大概二十多分钟的广告。电影对白比较简单,大概能看懂。本来想着十一点差不多结束,没想到一直看到了快十二点。回想起来已经记不起是后面的剧情乏味,还是倒时差的缘故,感觉越来越困。最后颇受好评的结尾都没看到就提前离场了。
这时是十二点多,公交已经停运。打车觉得太贵,而且 Bellevue 似乎没有共享单车或滑板车,最后决定步行回酒店。就这样,午夜十二点,我在美国街头走了十五分钟回到酒店。大概因为 Bellevue 是富人区,所以没有被抢劫和枪杀。一路上只见到两个遛狗的人。
这次旅行最糟糕的体验当属饮食。这一周吃到的大部分东西要么太咸要么太甜(而且还很贵)。麦当劳和肯德基有装饰精美的小房子,但是吃了一次发现汉堡里的肉有些硬和咸。
没有车的人生活会很不方便,酒店步行范围内很难找到便利店和超市。落地第一天晚饭,用咖啡机烧热水泡了带过去的唯一一盒泡面,其他几天都在后悔没有多带一点。
临走的最后一天,终于吃了顿像样的饭。周鹏飞请我和 Cynthia 去吃了一顿泰餐。终于吃上了接近中国菜的食物,我和我的胃都很感动。
本来想多呆几天,但是微软的奖学金限定了一周的往返航班日期。在回国的飞机上,坐累了,站起来看前排的电影。一块块小小的屏幕里同时放映着不同的人生,在两小时的长度里展开和结束。左前方的屏幕里是《布鲁克林》。看着女主角在纽约和家乡生活之间徘徊犹豫,感到难过。人实在太渺小了,一生也是如此短暂。面临的选择稀少且艰难。大部分时间都在各种搀着苦味的努力和无聊的工作里浪费掉了。
不如去海边散步,晒太阳,交新的朋友,传递快乐,再整点薯条。
回想起第一天凌晨四点醒过来,因为时差混乱睡不着了。想到接下来几天都可以放松地玩,心情好极了。
海边的那句诗,后来我在网上找到了完整的段落,出自 William Ernest Henley 的《Invictus》:
It matters not how strait the gate,
How charged with punishments the scroll,
I am the master of my fate,
I am the captain of my soul.