作者归档:李辉

《Flask 从入门到进阶》签名版预售

五年了,终于等到这一天。《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 吧?

 

《Flask 入门教程》第 4 版发布

即将出版的新书(预计将于本月底发售)变成了一个超强 deadline,它提及的所有东西都要在发售前成为现实。比如写进书里但其实还不存在的 APIFlask 3.0.0 版本,以及这个可以被当作先导材料的《Flask 入门教程》。

面向 Flask 2.x 的旧版本当然没法作为先导材料,所以断断续续花了 26 个小时完成了第 4 版的更新。新版本主要有下面这些变动:

  • 优化全书的内容和措辞
  • 增加对 uv 的介绍
  • 升级到 SQLAlchemy 2.x
  • 针对 Flask 3.1.x 进行内容更新
  • Python 支持版本调整为 3.9+
  • 增加对蓝本、工厂函数的介绍

另外正式加了一章介绍为什么以及如何为本书付费,取代了主页上自愿点击的「付费支持¥10」按钮。考虑到整本书内容完全公开,所以没法阻止读者逃票,但至少我已经克服了「伸手要钱」的羞耻。对于在工作之外挤出的这些时间,我需要一些正反馈。这样可以让自己更认真维护下去,也不会产生怨念。不仅是获得收入,有时还会收到读者的附言感谢,这给我的生活里带来了很多随机的开心时刻。

写新版本的过程中有时也会想,现在跟 AI 说一句「帮我用 Flask 写一个 Watchlist 程序」就大概能实现的程序,还有人愿意来读教程吗?我想至少,在通过教程来学习编程可以让你说一句「我真厉害」,而不仅仅是一句「AI 真厉害」。

另外这个教程最早是在 2019 年发布的,六年过去了,部署章节介绍的 PythonAnywhere 的 UI 和功能基本没有任何改变。我只需要更新 Python 版本选择那个页面的图片,其他部分不需要任何改动。有一种值得托付终生的感觉。希望可以做出来有这样品质的产品和作品。

最后附上相关链接:

邮箱服务中断乌龙

七月底,因为 SendGrid 不再提供免费额度,我开始寻找替代服务。在给 greyli.com 这个域名配置新的邮件服务 DNS 的时候,某些原因一直没成功。尝试过程中手贱把已有的几条邮件相关的 MX 和 CNAME 记录给暂停了。

一个月后的今天,发现注册某个服务总是收不到验证码,这时才发现我当时是把 hey@greyli.com 的邮箱服务的 MX 记录给暂停了。整整一个月没法收到邮件,我太蠢了。

如果哪位朋友在这一个月内(2025/7/25 – 2025/8/26)给我发了邮件,请不要恨我,我只是没有看到。如果可以的话,麻烦再重新发一遍吧。

梦的河流

家西边有一条小河。水源从山上来,经过幽深的地下,一路到这里,从一个废弃的水闸流出来。冬暖夏凉,清澈幽静。

对村里人来说,它叫「洗衣沟」。大人们常常聚集在这里拿着棍子敲打衣服。洗衣粉的袋子随手丢在河边。夹着土,叠了一层又一层。

对那时候的孩子们来说,这里是一个游乐场。在高高的水闸台子上往下扔石头。用石块在水里筑起小小的水坝。在河两边挖一些黄色的黏土,然后坐在台子上玩泥巴。黏土摔在粗砺的水泥台子上,常常会粘起一些半透明的小石子。于是我们做出来水晶手枪、动物和坦克。玩够了之后再还给土地。

过年的时候,我们会往水里扔鞭炮。除了普通的炮和有塑料外壳的「鱼雷」,印象最深的是一种在爆炸之前会旋转发光的炮。只在一家小店可以买到。据说是从经过国道的货车上掉下来的一箱炮,包装上是看不懂的英文。它在水下旋转,闪出五颜六色的光。光透过水变得缓慢而绚烂,像是发生在另一个世界的景象。

我们家买了洗衣机的时候,邻居们都过来参观。后来村子里的洗衣机越来越多,去河边洗衣服的人越来越少。偶然会见到有人去洗冬天的棉衣或是工厂的工服,总之是太脏太费水的东西。不管怎样,洗衣沟的水还是那样清澈,不知疲倦地流淌着,只不过岸边和洞深处多了很多水草。水草越长越多,直到占领了所有空白的水域。

再后来,河的右岸开了一家养鸭场。他们修了一条管道,把粪便排进河里去。下游的鱼塘主不愿意了,争执不下,就在上游用推土机筑了一个大坝,把整个河流硬生生地截断。人们在河边扔的垃圾也越堆越高。有人把成堆的蒜苗倾倒在这里,沤烂后发出难闻的味道。小河无聊的时候,也许会计算距离下一次建设美丽乡村还要多久。而它没想到的是,先等来的却是一场谋杀——左岸的砂石场经过一次扩建,把水闸连同河流都填平压在土下。他们需要可以挣钱的土地,不需要一条无用的河流。

面对垃圾、粪便、切割和覆灭,河流能做什么呢? 它什么也做不了。面对人类,它只是一个被征服和战胜的对象。

不会再有大人一边洗衣服一边大声地聊天。也不会再有孩子在那里玩水和泥巴,放鞭炮,用树叶叠出能舀水的勺子。

我在电脑里翻了很久,终于找到三张拍摄于 2013 年左右的照片。翻照片的过程里,我想到小学暑假住过的、散发着臭水沟气味的望京城中村,还有高中学校旁边短暂住过的小村子。再次想起的时候才发现它们已经全都不见了。

它们变成梦的河流,不再滚烫,也不再转动,只剩下空白。

blank

blankblank

#清空草稿箱计划# 原文创建于 2023 2 6 日,过年回家发现小河不见了。标题灵感来源于伍佰 & China Blue 的《梦的河流》。

西雅图和微软 MVP 峰会游记

每一次的游记都拖到放弃。从 19 年第一次去台湾,到上次去日本,每次都想着记录一下,最后都不了了之。我想这一次一定要完成这篇游记,毕竟这是我去过最远的地方。

出发前

看到微软 MVP 峰会奖学金(scholarship)邮件的时候是在去年十二月初的某个工作日。中午花了一个小时的时间来写申请表,当时心想应该没几个人会这么认真写申请吧——后来发现果然我是中国区唯一拿到奖学金的人。这是微软第一次开放 MVP 奖学金项目,提供了最高 2500 美元的机票和酒店费用支持。这基本覆盖了这次美国行的主要开销,非常感谢微软。

收到奖学金申请通过的提醒邮件已经是一月末,距离三月末的 MVP 峰会剩下两个月时间。这时去美国还缺少最关键的东西——签证。现在看来申请签证的整个过程极其曲折:

  • 准备各种材料
  • 在一个很难用的网站上填写一个很多页的表格(DS160)
  • 在另一个很难用的网站上每天刷新日历预约合适的面签时间(¥1300 签证费)
  • 起个大早排很长的队去面试结果没过(顺便说一句,签证面试官不会告诉你为什么没有过,而且签证费也不退哦)
  • 打算再试一次于是重新填写 DS160
  • 重新预约面签(¥1300 签证费)
  • 上海三月排不上只好请两天假去北京面签(¥1500 路费+酒店)……

在经历了各种忐忑和焦虑,以及无数次地刷新、登录和等待后,终于在北京通过了面签。走出大使馆回酒店的路上,心情好极了。一切终于重归平静。如果这次还没有通过,我很难对自己解释这两个月的折腾是为了什么。

blank

最终我在出发前一周拿到了签证。接着在临出发当天的上午拿到了送给美国朋友的伴手礼,出发去机场前一小时去顺丰快递站提前拦截了为这次行程赶制的英文名片。总之在各种混乱和拖延中,完成了全部准备工作。

初印象

上海直飞西雅图需要 11 个小时,长途经济舱很难熬于是三部电影连连看。下飞机的第一印象是——美国的咕咕好大好勇敢,旁若无人地在人行道上散步。在机场迷路了一阵,在工作人员的提示下,终于在机场一侧的出口找到了公交站台。第一次上车前不确定要买哪一种类型的票,问了司机,司机直接让我上车,说不用买了。就这样,继续展开我的美国自由(免费)行。

blank

第二印象是,这里的人大都很有礼貌且友善。坐公交的时候几乎每个人下车前都会和司机说一声谢谢。之后的几天基本也都是这样的体验:路边的车会提前停下来等你过斑马线,司机微笑着示意你先走。在商场里,店员会主动和你微笑打招呼。车站里的工作人员会和你说早上好。在远离市区的地方走路,有时迎面走过的陌生人也会和你打招呼。我甚至在想,是不是因为人太少了。如果不对彼此热情一点,就会感到太孤独。

微软 MVP 峰会

在第一次面签的时候,我发现没有好好准备的话很难一下子说清楚微软 MVP 是什么,我和微软是什么关系,以及为什么微软要邀请我去美国参加这个会议。

微软 MVP 的全称是 Microsoft Most Valuable Professionals(微软最有价值专家)——是微软在全球范围内给一些对微软技术或开源社区有突出贡献的人颁发的奖项。我在 19 年成为微软 MVP,也是国内第一个 Python 方向的微软 MVP。

blank

微软 MVP 峰会可以理解为全球微软 MVP 的大聚会。微软 MVP 峰会每年都会在西雅图的微软总部举办,这里会有各种编程技术和微软产品相关的分享,可以和微软产品组面对面交流和讨论。虽然我在六年前就成为了微软 MVP,但是考虑到去一趟美国是笔不小的花销,所以一直没有线下参加。今年有幸拿到了参会者奖学金,第一次线下微软 MVP 峰会终于成行。

我住的酒店在 Bellevue,临近西雅图和微软总部所在的 Redmond。而且酒店刚好在轻轨旁边,坐到微软总部不到 30 分钟。那几天每天上午九点出发,下午五点左右回来。感觉像是在微软上班。

blank

因为是签了保密协议的内部活动,所以参会的具体内容没法分享。峰会一共三天,前后两天也会有一些产品组的活动可以参加。活动类型有很多,比如演讲、讨论会、见面会、剧场分享、园区游览,加起来一共有 400 多个 session。你可以提前在网站上查看和规划所有想去的 session。因为我对微软技术了解得并不多,所以选的议题基本都和 Python、GitHub、VS Code 相关,或是其他非技术相关的话题和活动。这几天也学到了很多活动组织相关的经验,也许未来办代码厨房活动的时候可以用得上。

微软的园区很大,去不同的楼经常需要搭摆渡车。会议的氛围很好,大家都很有热情。不过我英语一般(在美国的几天,多次立志学好英语),听着演讲经常不知道为什么大家都笑了起来。吃的东西也很丰富,每一餐都有不同类型的食物。

blank

Clippy 由 Christina 霸姐扮演

MVP 提名

如果你在开源和技术社区有一些活动和贡献(包括写书和博客。不一定要和微软技术相关,也可以是 AI、Python 等领域),欢迎联系我,我可以帮忙提名。

微软 MVP 除了可以去微软总部参加每年举办的微软 MVP 峰会之外,还有很多福利。大致列一下:

  • 各种产品的会员,比如 GitHub Pro、Linkedin Premium、Office 365 订阅、Clipchamp Premium 等
  • Azure 每年 $12000 的额度
  • 参加微软举办的各种技术活动
  • 参加产品组的内部讨论会议
  • 还有很多第三方软件订阅福利,比如 JetBrains All Products Pack、Pluralsight、GitKraken 等

可以通过邮箱 hey@greyli.com 联系我,或者在领英Twitter 上发消息给我。

最好附上一个简单的自我介绍,如果有简历就更好了。

一些奇妙的缘分

在微软 MVP 峰会这几天收获了一些奇妙的缘分。第二天结束是 Networking Mixer 活动,和第一天下午面向 Developer Technology 分类 MVP 的 DevTech Social 不同,这次是所有 MVP 都可以参加的社交聚会。地点在 4 号楼,一楼很大,整层楼散布着各种食物和酒水,而且到处都是人。入场会拿到一个 Bingo 游戏的卡片,用来集章抽奖。卡片上列满了微软产品组的名字,你需要找到分散在各处的对应产品组的员工给你盖章。同时在找的过程里可以品尝各种食物。

在找和吃的过程中,我接连碰到一个德国人——第一天午饭和他坐在一起闲聊了几句。直到第三次碰到他,我们都觉得缘分太深,于是就结伴起来。我们一起聊天一边找吃的,吃得差不多了就去四号楼外面的微软 logo 拍照。他说因为担心流浪汉问题,所以来美国几天一直没敢坐公共交通。我安慰他说没有的事,电车上干净人又少,公交上大家也很友善。顺便教了他怎么在手机上买票。本来打算一起去坐轻轨回 Bellevue,结果走到一半下了雨,他要回去打车,我就把剩下的最后一件伴手礼送给他,然后道了别。

中国区有十几位 MVP 来参加会议。其中有一位 KOKO 是台湾的 MVP,偶然和他聊起来才发现他在 19 年的时候听过我在 COSCUP 的那场演讲。啊,命运的奇妙连线。

到美国的第二天刚好是瑶瑶生日,在西雅图闲逛的时候想寄一封生日贺卡回家。看地图已经在附近却怎么也找不到邮局。这时一个美国人急匆匆地走过来问我知不知道邮局在那里,我说我也正在找。沿着街走了一段,最后我们一起找到了邮局。寄完贺卡在海边公园拍照时,一个没穿上衣的肌肉猛男刚好入镜,他看到我在拍照就顺势摆了一个 pose,然后对着我微笑。我也给他竖了大拇指。作为一个喜欢和陌生人聊天的人,很喜欢这样的氛围。

blank

西雅图漫游

到美国的第二天在西雅图玩了一天。买了 City Pass C3,类似景点联票,$120 左右。三个景点组合我选了玻璃艺术馆+太空针塔+华盛顿湖游船。玩下来发现很像浦东美术馆+东方明珠+黄浦江游船。骑共享滑板车转来转去,心情放松,但也有点冷。本来以为从 70 号码头骑车赶到 55 号码头已经够冷了,结果差点冻死在游船上。

很喜欢海边的小公园。在公园的长椅坐着,低头看到地上写着一句诗:“I’m the captain of my soul”,一边念着一边抬头看到广阔的海和天空。

blank

除了这几个景点,其他时间都在到处乱逛。作为路上观察学入门者,尝试发现和理解各种不同的东西。这里的电车和公交车对自行车很友好,公交车车头有可以展开的自行车支架,电车有专门空出的自行车位置。公交车还可以向路边一侧倾斜车身,让老年人更容易跨上台阶。这里的鸟很多。居民区有各种好看的小房子。市中心某些街道上有流浪汉和吸了毒在「挂机」的人。

blank

闲逛中拍到的最满意的照片是下面这张:

blank

第三天峰会下午的分享不太感兴趣,就去逛了微软商店。用半价折扣买了一个 Xbox 手柄,然后坐车去华盛顿大学看樱花。华盛顿大学门前是一大片草坪……写到这想起来实际上它没有大门也没有围墙。没有用来人脸识别和刷身份证的门禁,没有身份证放上去之后一句“无权限”的大声播报。没有打量和禁止你的保安。没有预约入校的申请表。你可以径直走进图书馆,拿起一本书看,不用担心自己是否被允许。

说起来我每天都坐的轻轨——连接西雅图大都市区的 Line 1&2——也没有门。每个站会有下图这样的一个入口,可以在两边刷手机付钱,上面提示语写着「付费进入」。因为我都是在 Transit App 上买日票($2),所以也不用刷。车站会有 1~2 位工作人员,但在那里的一周都没有人查我的票。没有被预设为坏人的感觉真好。

blank

总体来说是很放松的一周。自然环境让人舒服。城市里没有丑陋的标语和宣传画。人很少,动物很多。大部分人的精神面貌是健康和自信的,也许他们没有太多愤怒和恐惧。

看电影

在制定旅游计划的时候,我列了一些想要体验的事情,有一条是看电影。在旅游这件事情上,相比于作为游客参观景点,我更喜欢体验本地人的日常生活。所以我经常随便在地图上找个地方,或是跟着公交车坐下去,在某个随机的站点下车。

在周二打折日订了票,只花了 $7。电影是最近拿了奥斯卡金像奖的《Anora》。电影院在 Bellevue 市中心。取票后买了点吃的,然后就直奔影厅——电影院也没有人检票。和国内准时开始不同,电影开场后还要再看大概二十多分钟的广告。电影对白比较简单,大概能看懂。本来想着十一点差不多结束,没想到一直看到了快十二点。回想起来已经记不起是后面的剧情乏味,还是倒时差的缘故,感觉越来越困。最后颇受好评的结尾都没看到就提前离场了。

这时是十二点多,公交已经停运。打车觉得太贵,而且 Bellevue 似乎没有共享单车或滑板车,最后决定步行回酒店。就这样,午夜十二点,我在美国街头走了十五分钟回到酒店。大概因为 Bellevue 是富人区,所以没有被抢劫和枪杀。一路上只见到两个遛狗的人。

blank

这次旅行最糟糕的体验当属饮食。这一周吃到的大部分东西要么太咸要么太甜(而且还很贵)。麦当劳和肯德基有装饰精美的小房子,但是吃了一次发现汉堡里的肉有些硬和咸。

没有车的人生活会很不方便,酒店步行范围内很难找到便利店和超市。落地第一天晚饭,用咖啡机烧热水泡了带过去的唯一一盒泡面,其他几天都在后悔没有多带一点。

临走的最后一天,终于吃了顿像样的饭。周鹏飞请我和 Cynthia 去吃了一顿泰餐。终于吃上了接近中国菜的食物,我和我的胃都很感动。

回国

本来想多呆几天,但是微软的奖学金限定了一周的往返航班日期。在回国的飞机上,坐累了,站起来看前排的电影。一块块小小的屏幕里同时放映着不同的人生,在两小时的长度里展开和结束。左前方的屏幕里是《布鲁克林》。看着女主角在纽约和家乡生活之间徘徊犹豫,感到难过。人实在太渺小了,一生也是如此短暂。面临的选择稀少且艰难。大部分时间都在各种搀着苦味的努力和无聊的工作里浪费掉了。

不如去海边散步,晒太阳,交新的朋友,传递快乐,再整点薯条。

blank

回想起第一天凌晨四点醒过来,因为时差混乱睡不着了。想到接下来几天都可以放松地玩,心情好极了。

海边的那句诗,后来我在网上找到了完整的段落,出自 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.

2024 年总结

2024 年和 2023 年差不多,可以说是陷入了一种结构性疲惫。上班本身还好,但上班之外的妄想太多,健康状况又很差,所以总是身心疲惫。2023 年做了什么,回想起来已经一片模糊,以至于年总结都没有写。而这篇 2024 年总结也一直拖到了现在——2025 年已经快过去四分之一。

写作

过去几年,这本未完成的书是我最大的困扰和焦虑来源。所以今年最大的成果就是完成了《Flask Web 开发实战》第 2 版。算上交稿后的修订(出版社的 AI 审稿程序让我多花了 50 个小时来拯救我的书稿),写这个新版一共用了六百个小时。新版还拿到了 Armin Ronacher(Flask 作者)的推荐语。我在 Flask 领域的探索,这本书算是一个圆满收尾。接下来可以好好休息,然后探索一些新东西了。顺便说一句,因为出版社的组织调整,新书预计要到九月上市,这次<del>应该</del>不会再跳票了。

blank

社区

起源于我在 2022 年开源年会的代码厨房俱乐部现场招募,2023 年我们六位成员完成了依次取名为四分之一/二/三/四的四次聚会。我在最后一次聚会确立了代码厨房社区的构想——想要创建一个好玩、有用、关注人而不是技术、最小商业浓度的社区。确定了代码厨房社区的主要板块:以社区论坛为基础的 Steak Overcooked 和菜谱,一起做开源项目的「开源松 Song of Open Source」,还有未来可能会举办的「代码厨房年会 CodeKitchenConf」。23 年举办了第一场开源松,24 年用公司的场地办了第一场线下开源松,接着年末又和 PyCon China 2024 合作办了一个 Python 专场开源松。两次线下开源松都由「代码厨房乐队」的演出收尾。在这些活动里见到了很多认识或不认识的朋友,收获了很多快乐。另外年末重回了 PyCon China 组委会,帮忙打了一些零工,主要负责策划开源松会场。

blank

在公司里也做了一些类似开源社区的探索。比如尝试对公司内的一些项目按照开源项目的标准进行改造;基于 Jenkins 搭建起一整套 Markdown 文档的预览和部署方案,并引导大家把文档放到代码仓库里;独立设计和组织了一场非常好玩的社区市集和两次 Meetup。在社区市集里又嵌套举办了「第一届五角场办公椅滑行比赛」。

blank

作为一个回顾,年中去 CommunityOverCode 2024 做了一个演讲来分享在公司内外的社区营造实践。上班后精力有限,23 年也只做了一场演讲,是在 PyCon China 2023 分享的《濒危 Flask 扩展拯救计划》。关于社区建设的探索,晚点再单独整理一篇文章出来。

在开源项目上没什么大的进展,主要是在维护旧的项目。23 年给 APIFlask 发布了 2.0 版本,希望 25 年可以完成 3.0 版本。

生活

和 23 年一样,因为大部分时间都比较疲惫,所以身体状态好的某些日子就显得非常美好。记得有几个冬日里的晴天,我在公司坐着,忍不住频频看向窗外的树。被阳光照得发亮的叶子在风中摇曳,水面也在慢慢跳动。心里涌动着幸福的感觉。

blank

除了日常的疲惫,停不下来、无法放松的脑袋,以及大段的感冒,24 年还是有很多值得记录的事情:

  • 搬到了一个更喜欢的地方,在三号线附近。终于逃离了老年人聚居地。
  • 邀请全家人一起来上海玩了几天。在迪士尼收获了幸福开心的家庭回忆。在快要闭园的最后一个间隙里,我们在人群和星星点点的灯光里奔跑:瑶带着弟弟和爸去坐创极速光轮,我和妈去看小熊维尼童话书。
  • 学会了游泳。经常在周五和同事提前下班去游泳。对我来说游泳是一种新的自由体验。在深水区看着泳池时感到无比宁静。水池底跳跃的光线,一块块蓝色瓷砖,像是一场流动的梦境。
  • 和瑶一起去东京看了李志的「三缺一」演出,然后在东京走走停停,转悠了一周。演出唱到《和你在一起》的时候,我偷偷把戒指戴到了她手上。从东京回来我们去领了结婚证,和瑶——我亲爱的高中语文课代表。不知道哪天在街上会不会遇到把我们拉去办公室,说我们以后绝对不可能在一起的历史老师。

其他的快乐回忆大都是音乐、游戏、书和电影带来的。

除了李志的「三缺一」,印象深刻的演出还有 23 年万青的「梅奔专场」,还记得演出即将开始时场外的雷声滚滚。从旺福那里接收到的快乐能量持续了很久。把豆瓣 FM 红心歌单导出到 Apple Music 之后,很长一段时间都在听这些高中大学时收藏的歌。

玩了一些游戏的开头,通关了《黑神话·悟空》,其他大部分游戏时间都花在了 CS2 上面。去掉大学时玩 CS:GO 的一百个小时以外,算下来今年玩了三百个小时。然而技术并没什么进步。沉迷于和弟弟或同事一起玩搭档模式然后各种努力尝试用电击枪电人。

电影看了一些,回想起来像是穿插在日常生活里的黑乎乎的幻梦。读书则是想起来就读,大多数时间只是买。最近看的书里很喜欢《夜晚的潜水艇》。喜欢第一个和最后一个故事的精巧和想象力。喜欢《竹峰寺》里对暮色的描写,还有《李茵的湖》里的八九十年代质地。

工作

上班第三年。为了让工作没那么无聊,这三年尽了最大可能把自己的兴趣融入进来。除了 Python 方向的探索和前面提到的内部开源社区建设,还在演艺方面做了一些尝试。23 年为了部门年会节目成立了一个临时的「六点五月天」乐队,然后把乐队组建、节目准备和表演过程做成了这个《干杯》短片。后面就开始承接各种内部活动的视频拍摄和剪辑工作。

24 年部门年会又成立了「Grey 和他的朋友们」乐队。这次还做了三个不同版本的年会预告片,悬疑版、搞笑版和飞行版各一个。飞行版里和同事用穿越机拍了从公司对面的楼出发、从露台飞进公司并下楼进到年会会场的镜头(想要实现一镜到底的效果,嘿嘿)。年会开场时放了这个视频,大家坐在会场里看从公司外面离自己越来越近的飞行画面,和 23 年的视频异曲同工。

blank

工作三年里还有很多有趣的经历和感想,后面放到单独的文章来写。

新年计划

这两年在写书、工作、开源项目和社区活动的夹缝里喘不过气。2025 年对我来说希望是「舒展」的一年。想要花很多的时间在自己身上,让自己身心更加放松,多关注身体的紧张和疼痛。想要过一些坚实平静的离线生活,减少浪费在网络上的时间。三十岁对我来说可以作为一个中场休息,想想下一个十年做些什么好。

今年的目标大部分都是让人快乐的目标:

  • 恢复健康(正常人 80% 水平)的身体状态
  • 多用英语(主要是写和说)
  • 日语入门(记住五十音图)
  • 学会自由泳(再纠正一下蛙泳姿势)
  • 学会开车(拿到驾照)
  • Flask 入门教程第四版
  • APIFlask 3.0 版本
  • 办至少一次代码厨房线下活动

大概想到这些,考虑到是舒展的一年,能完成三个就可以了 :P(年初把这些计划发到了代码厨房,也欢迎来分享你的计划)

除了这篇拖了很久完成、还留着一些线头的年总结,还有很多文章躺在草稿箱里,希望今年能多完成一些。

最后祝自己和看到这里的你,新年更平静,也更自由。


这篇文章顺便加入了一些 23 年的内容。动笔之前先去翻了 23 年年总结的草稿(还记得那种疲惫缠身的感觉),附在这里留做备份:

  • 工作一年后才开始更加怀念那几年的自由时光。早知道工作是这样,我一定不会浪费那些时间,说不定会做出更多有意思的事情。
  • 今年不知道怎么了,每天都困得要命,尤其是下午和晚上。如果没什么病的话,大概率是因为开始上班导致的。工作消耗了我大部分的精力,让剩下的一切都变得无聊。最近每天晚上就只是在网上看别人打游戏。真希望没有什么开源项目,不再写什么书,不用理会任何提问,然后开始学画画、滑板或是吉他。
  • 春困,夏困,秋困,冬困。
  • 休了三天假,本来以为可以在书稿进度上获得进展。结果每天也就写了两小时而已。不工作的话,还有其他事情来占领时间。看电影、看演出、看病。以前对时间斤斤计较,经常嫌女朋友打扰我,现在发现自己一个人呆着也没有变得很自律。
  • 太多事情想做了,但还是先做这一件吧。一次只做一件事。
  • 不再接受随机性的影响。不看朋友圈、Twitter 和 Reddit,生活就会平静很多。
  • 停下手里在看的书和电影。关门写书。

代码厨房开源松 x PyCon China 2024

活动已结束,回顾文章见这里:https://codekitchen.community/t/topic/1372


七月我们突破了屏幕的限制,在戴尔五角场办公室举办了第一次线下代码厨房开源松。而这一次开源松 Sprint 6 我打算在 11 月 23 日举办的 PyCon China 2024 大会里办一场开源松。没错,一场面向 Python 爱好者的开源松!

blank

开源松!?

开源松(Song of Open Source)是代码厨房社区自造的词语,可以大概理解为开源黑客松,但是又不必那么 hack。只是一场开源爱好者互相交流和共同参与开源项目的聚会活动。我们希望借助这个活动来鼓励和帮助大家参与开源项目、推动开源项目发展、孵化新的项目 idea。

如果你从来都没有参与过开源项目的话,这次活动也许会是你开源之路的第一步。你会认识其他喜欢编程和开源的朋友,和开源项目维护者们交流,顺便提交第一个开源贡献。

PyCon China 2024 x 代码厨房开源松

开源松活动在大会下午开始,你可以在现场找到开源松会场指引标识,或者到代码厨房社区展台询问。如果打算参加活动,记得在报名大会时勾选相应的选项。会场内会设置三个活动区域:

  • 养成区:给没有参加过开源项目的新手提供科普和指导
  • 发电区:用爱发电的地方
  • 休息区:代码写累了?来和其他开源爱好者聊天吧

顺便也欢迎来代码厨房展台玩。我们为还没开始工作、或者刚刚被裁的朋友准备了「Python 八股文面试题挑战」……通过挑战的话可以体验现场拿 offer 的感觉。

有哪些项目可以参与?

在其他项目报名之前,我们已经准备了两个代码厨房社区项目:

  • FineWeather:一个 Vuejs+Python 实现的网络相册

不管你喜不喜欢拍照,肯定有一堆照片存在某个地方。有没有想过摆脱商业公司的限制,自己部署一个在线相册?放上自己最喜欢的照片,自己的数据自己管理。一起来打造一个完美的开源相册程序吧。

下面是项目作者 Allen 部署的相册实例

blank

blank新增项目:

  • PDM – Python 包和依赖管理器
  • pyecharts – Python ECharts Plotting Library
  • UtilMeta – Python 渐进式元框架

基于 Flask 实现的 Web API 框架,集成了 marshmallow、webargs 等项目来让 Web API 开发更加简单。我们在计划项目的 3.0 版本,有很多有用的功能可以加入。完成了大半的文档翻译项目也等待一个人来再推进一步。

如果你有自己的 Python 开源项目,欢迎报名参与!作为项目维护者,你需要完成这些事情:

  • 准备三个不同难度等级的任务
  • 在现场介绍项目和任务
  • 指导参与者完成任务
  • 准备小奖品(可选)

报名方式:在代码厨房社区置顶贴留言,或是通过下面的表单报名:

https://jsj.top/f/CscvKZ

你需要准备些什么?

除了了解 Git 基本用法,你还要会一点 Python。有一台充电器还找得到的笔记本电脑。还有一点点的开源热情。

如果你不仅仅想要来做开源项目,那么可以带一点其他的东西来。比如一个关于你自己项目或其他经验的五分钟分享、新项目的 idea……尽管自由发挥。 如果你有其他想法和建议,欢迎留言。

开源松/大会报名

这次开源松将在 PyCon China 2024 内举办,因此报名大会即可参与:

https://hdxu.cn/g77s

一辆自行车多久会被偷

已经很久没有真正锁车了。今天终于决定扔掉车锁,想看看哪天车子会被偷。如果没有人偷,说明我的车子太破,根本就不会被偷,那每天上锁岂不是多余?如果被偷了,那我就买一辆公路车。这样就可以像通勤路上飞过我身边的人那样,撅起高傲的屁股,让齿轮发出好听的声音。

写到这里就去豆瓣翻了下这部《偷自行车的人》。我在若干年前标记时写道:「纯粹的电影。平实、有感染力,这他妈才是现实主义啊。餐厅吃饭那段真让人心酸。」。等车子被偷那天,我计划重新看一遍这部电影,然后回来更新这篇文章。

最近勉强算是把书写完了,可以放下一颗心来。但是又好像没有完全写完,因为还要处理读者试读留下的评论,以及编辑还没发来的审稿建议。接下来有太多新的计划可以展开,不过让心再次悬起来之前,不如多停留一会儿。与此同时,CS2 的游戏时间记录即将突破 300 小时……


11/4 更新:被偷了。心情很复杂。错愕、后知后觉的侥幸突然中断、失去的难过混在一起,远没有想象得那么轻松。只是因为早上红绿灯晚了几秒,把车子停在了另一个不常去的地铁入口,晚上回来车子就不见了。事实证明,在上海杨浦,一辆没上锁的六成新自行车被偷需要七天。


2025/3/3 更新:买了一辆二手的迪卡侬 Riverside 500 旅行车,每天又可以开心地骑车上下班了!

夏天不是读书天

#清空草稿箱计划# 原文创建于 2023 年 6 月 24 日。

回上海的这一天上午,我需要去附近的乡里走一趟。

桃市附近多了一家养蜂场,叫小武养蜂场。风景区附近的围墙上有一些新的标语。下一句是“仰望星空展未来”,上一句你肯定猜不出来——“一心一意跟党走”。电信营业厅戴着口罩咳嗽的店员,提醒我新冠还没有过去。天气很晒,但风很凉爽,耳机里是 Vampire Weekend 的那张《Father of the Bride》,一张专辑刚好够打一个来回。在这样的街上,太阳浇灭了所有购物的冲动。更何况这里没有城市里的那些陷阱——没有音乐,没有香氛,没有创意十足的广告,没有精致完美的女人在墙上直勾勾地想把你看穿。只有奄奄一息的老年人和中年人在发烫的遮阳棚下玩手机和打盹。我还是想买一些东西,只想买一些必需品。去两元超市给小巴买了一个橡胶球,两块钱。不过每次送给它的球都玩不了几天——要么被它咬烂,要么被邻居家的狗偷走。然后去隔壁的超市买了一瓶矿泉水,也是两块钱。

从上海回家是在父亲节前一天,我在火车上看完了安妮·埃尔诺的《一个男人的位置》。听了《昨日之海》的某期播客后买了这本书和《一个女人的故事》。某一天我把《位置》读了个开头,然后放在我的床边。一放就是许多天过去。这种情况多了,床头柜变成书柜,堆栈变成积木。果然旅途才是最适合阅读的环境,单程就可以读一本书。

这本书的阅读体验像是某个人的博客,一个为爸爸写的博客。很多人小学的时候都会写一篇《我的爸爸》这样的作文。成年之后,直至爸爸去世,却很少有人再写一篇《我的爸爸》。我突然想到,世界上某个人也许会在爸爸的葬礼上读他写的第一篇《我的爸爸》:我的爸爸不抽烟,也不喝酒。他戴墨镜的样子很酷。他告诉我酷有很多种,外表酷只是其中一种,做事情认真也是一种酷,帮忙别人也是一种……

读的过程中,我不断想起从小到大我熟悉的那些“大人”。想起每一次的婚礼和葬礼,那些家族里的男人们。想起他们在这个世界上的位置,以及他们为了把下一代推离到更远的位置的努力。他们从没有想过有另一条路可走,总是像个硬汉。他们快乐吗?他们的孩子快乐吗?也许从没有人问过他们。祝他们夏天快乐。

干杯

最近花了很多时间在准备一个年会节目。整个过程记录到了下面的短片:

https://www.bilibili.com/video/BV1Re411E7uX

整体的设计是这样的:节目一开始会放这个短片,当画面放到走向年会会场的时候,我们就真的入场。入场后画面会是滚动的歌词(上面的视频里已经被替换为实际的演出画面)。滚动的时长就是演唱的时长(三分钟),唱完刚好会出现演职员表。

blank

整体基本按照计划执行,唯一的遗憾是前面的部分因为网速原因有些卡顿,卡点全都没对上。除此之外还有很多乌龙:话筒放错了位置,导致我要仰头唱,Qingfeng 要低头唱。上场前被谁碰了一下变调夹,导致六弦有点松。演出上午我还在弹错和唱错,反而正式演出却没出问题。再往前一天,还在纠结吉他收音和话筒支架问题。再往前半个月,因为高音唱不上去、吉他和弦切换不熟练焦虑,嗓子疼了好几天。虽然问题很多,最后呈现的效果还不错。

短片里很多穿帮镜头也没有时间打磨,比如上场前和演出时的衣服不是同一件。因为大家都在上班,经常随便抓一个没开会的同事帮我拍视频,大都只拍了一两条就用了。本来还计划了一些长镜头和分镜画面。因为时间有限,没法一一实现。

很开心的一段经历!剪短片、排练、演出都很快乐。关掉会场的灯,大家一起看我做的视频的感觉,让我想起来大学那次做的幻灯片。也许我应该去逐梦演艺圈 :P

最后贴上同事 Steve Wang 年会后写的诗(词)作结:

御街行

岁末寒风冬日暮,春将至,来时路。
久别年会今时归,料定狂欢无度。
铃鼓轻拍,沙锤细响,吉他低吟谱。
深度影视当乱舞,几月天?六点五。
彩排剪辑需几步,八仙各显其术。
用心数只,人生几处,今宵惟一赋。

 

Flask 已死,FastAPI 永生

好险,刚刚要写一个新项目,执行了 pip install flask。等得无聊所以打开了知乎,突然看到首页推荐的这篇《Flask 已死,FastAPI 是未来》。看到一半吓得我赶紧按下 Ctrl-C,然后重新执行了 pip install fastapi。好快!不愧是 FastAPI,连安装都这么快。

blank

Flask!Flask!你怎么了?Flask~Flask~你不能死呀!我跟你相依为命、同甘共苦了这么多年,何况我的书还没有写完,想不到今天白发人送黑发人……

blank

咳咳,说回正题,2021 年我写过一篇《请不要把 Flask 和 FastAPI 放到一起比较》。不是同一个等级的框架拿到一起比较没有意义。这篇《Flask 已死,FastAPI 是未来》从一开始的标题就是错的。

除了比较上的问题,上一篇文章里最后提的问题现在有答案了吗?

各种对比文章贴出来的 hello world benchmark 对于开发生产应用来说有多大的意义?这里的 benchmark 背后有没有任何的 hacky?异步是否等同于高性能还是要看情况?框架本身的性能在一个请求处理流程中占多大的影响?asyncio 的生态怎么样?

同时我也指出了一些 FastAPI 的问题——现在 FastAPI 营销至上的项目运作方式改变了吗?

从长远看这些大都是一些临时问题,而且 FastAPI 作者已经开始全职开发开源项目,这些问题在未来应该都会慢慢得到改善。指出这些是希望更多的人可以客观看待 FastAPI,吹捧并不能让一个东西变得更好,参与开发、介绍用法和回答社区提问是比盲目吹捧更有意义的事情。我当然期待 FastAPI 能够越来越好,也期待看到有更多优秀的 Python 框架出现,但我不喜欢过度炒作、盲目的吹捧和错误的对比。

如果一个人即没有深入了解 Flask,也对 FastAPI 的整体状况一知半解,然后突然跳出来写了一篇《Flask 已死,FastAPI 是未来》,他的目的是什么?炒作啊,朋友。标题党也就罢了,到处都是逻辑漏洞和事实错误这也行?

精彩片段赏析

前两天在 Twitter 上对这篇文章发了一点想法。大概是我的语言能力退化,导致很多人没看懂我的反讽和调侃……所以还是好好说话,摘评几条原文的内容:

其实我这篇文章,也可以叫做「Django和Flask之死」,但是在框架应用场景角度来说Flask和FastAPI对比更合适,而Django直接和FastAPI相比有一些差别。在一些商业场景(例如CMS)Django依然是首选,而Flask(甚至FastAPI)看起来更像个「玩具」,所以Django短时间不会被取代(Flask这些年不是也是没取代的了嘛)。
Django REST Framework(DRF)
Django主旨是为了在后端生成 HTML,而不是创建现代前端(如 React、Vue.js )或与其通信的其他系统使用的 API。所以FastAPI其实和Django REST Framework直接对标,它们主要场景都是构建 Web API,但是名字上也可以看出来,DRF还是依托于Django框架,所以缺点一样。

既然作者能看出来 Django 和 FastAPI 有差别,也了解「FastAPI其实和Django REST Framework直接对标」,那么就看不出来 Flask 和 FastAPI 在框架应用场景角度有差别?所以为什么不用 APIFlask 这种和 FastAPI 对标的框架,而是挑了 Flask?

Flask本来的优点是灵活性和极简主义,但这意味着很多很多组件需要自己造,这个要不然需要公司够大专门有开发者开发和维护,要不然得个人能力极强,否则插件很难达到生产级别,这就造成Flask的第三方插件质量层次不齐,且无法保证长期维护。就像我上面说的那些库,现在来看,其中已经很多不再维护了。

这点蛮中肯,Flask 扩展的质量和维护状态确实参差不齐,这也是为什么我要发起濒危 Flask 扩展拯救计划并创建这个 Flask 扩展状态监控项目。那请问 FastAPI 呢?首先 FastAPI 是否有这么多「FastAPI 扩展」可用?其次 FastAPI 的第三方插件就不会出现这些问题?说到底这是所有开源项目和社区生态都会遇到的问题。

所以即便是今天,你想用Flask构建一个API服务,还是要东拼西凑各个组件,其中某些组件有些没及时更新的地方要自己动手解决,这对于老手来说还好,对于新人来说很痛苦,尤其是你想要应用现在最新的实践方案和理念,只能望而兴叹。

首先作者了解 Flask 和 FastAPI 相比,后者的主要场景是「主要场景都是构建 Web API」,接着又说 Flask 生态构建 API 需要东拼西凑。听起来不太对劲?

另外 Flask 生态中类似 FastAPI 这种提供 API 整体解决方案的框架都被作者忽略了?随便列几个:

东拼西凑就一定是缺点?不熟悉这些工具的人选择打包方案,熟悉的人选择自己组装,这有什么问题吗?

这个时候Flask并不想接受改变,社区迟迟的不加入aio的支持,另外Flask原作者也去写rust了,把项目交给了2个维护者(现在只剩一个人了)。

到这里文章就开始有些不对劲了,喜剧/戏剧效果逐渐增加……Flask 开始被拟人化了。Flask 是谁?是谁要求改变?Flask 说了啥表示不想改变?

Flask 作者把项目交给了 2 个维护者?现在只剩一个人了?!Flask 真的好惨……可是这些事情都是什么时候发生的?虽然我最近两年开始工作已经没怎么给 Flask 提交代码,不知道哪天被踢出群聊。但是至少我从 18 年到现在一直是 Flask 的维护者,这些事情我怎么一点都不知道?

在Flask的那个时代,代码执行是单线程、同步的,这意味着要依次处理请求,前一个请求完成前,其他请求消耗在等待 I/O 操作上。而asyncio是最好的解决方案,它让I/O成为异步操作,无需等待任务完成即可获取任务结果并继续处理其他任务请求。

好奇 Flask 的那个时代是哪个时代呀?听起来像是妈妈在讲小时候的故事呢。Flask 2.0 已经添加了有限的 async 支持Quart (Flask 的 ASGI 实现)已经合并到 pallets 组织,作者正在推动 ASGI 支持的 Flask。这些都是这个时代的 Flask 在发生的事情哦。

而FastAPI天生支持并发和异步代码,代码写对了就可以在效率上达到极致,所以它被认为是目前最快的Python框架,效率和NodeJS或Go接近。当速度和性能至关重要时,FastAPI 是最佳选择。

嗯,这个我无从反驳。你说快就是快,宇宙最快 Web 框架。

另外由于集成了Pydantic,所以非常容易在项目中添加ORM(如SQLAlchemy),从请求中获得的对象可以直接传递到数据库,因为已经做过数据验证。反之亦然,可以将从数据库获取的对象直接返回。
相对的,Flask这方面的缺失的。

完蛋,Pydantic 对 Flask 发起了单方面安装制裁。当你在 Flask 项目里试图引入 Pydantic 的时候,就会出现安装错误“Warnning: Pydantic is strictly forbidden to installed into a Flask project. Your behavior has been reported to PAFAFC (Pydantic and FastAPI and friends Committee).”

再补充一点。FastAPI无论看项目名字还是介绍都能感觉出来它是用于构建API服务的,事实上FastAPI自己的核心代码也确实是这样的,可以说它不是一个传统的、完全自己实现的框架,它更像是一个集各家之长的框架,从一个空壳开始,把需要的、适合的组件组装起来。例如它没有模版引擎,如果你确实需要用它实现一个web应用要渲染模版,你可以再组合你想要的选择,当然还可以用Starlette内置的Jinja2(是的,也是Flask内置的)

作者对于 Flask 和 FastAPI 两者定位不同的认识真是越来越清晰了呢。不过「组合我想要的选择」不就变成前面说的 Flask 那样东拼西凑了嘛,不好。还有就是 FastAPI 为啥要在介绍模板引擎的文档里让我安装 Jinja2 呢?看来「相对的,FastAPI这方面是缺失的」。

上面提的是FastAPI的优势,但是也不能说明Flask已死,我为什么会这么觉得呢? 主要还是看开发者和用户的人气。

重头戏来了,下面终于到了对于「Flask 之死」的凄惨景观的详细描写(注:这几点后来作者看到了我在 Twitter 上发的东西又自己做了补充和修改。这里我引用的是原文)。

1. 社区活跃度。例如项目的Issue和Pull Request数量,Flask都是个位数,和FastAPI相比根本不是一个水平。这其实侧面证明项目不再活跃,因为如果活跃的话,老的用户会有更多需求,它们不来说明已经离开,而新的用户意味着有各种问题,文档即便足够全,其实我们要知道还是会有很多用户来提问和贡献代码的,没有就说明用得少。

如果你经常参与开源项目或是自己开发了开源项目,通常会了解到,一个流行的项目想要把所有的 issue 和 pull request 都处理掉是很难的事情。而 Flask 能做到这一点反而是维护团队的努力尽责和项目本身足够成熟的体现:

blank

以及对 issue 和 pull request 快速响应的体现:

blank

如果你想知道有多少人在用 Flask 和 FastAPI,有两个参考数据,一个是 GitHub 上开源项目的用户数量统计。这些可以在两个项目的 GitHub 主页直接看到。

FastAPI

blank

Flask

blank

另一个数据是 PyPI 下载量,这个可以在 PyPI Download Stats 上看到。

FastAPI

blank

Flask

blank

另一方面,不同的项目对 issue 的使用策略是不同的。有的使用自己的 issue tracker,有些鼓励用户来提问。Issue 和 pull requests 不仅不能用来表示项目活跃度,过多的数量反而能说明一个项目的维护状况堪忧。堆积的 PR 对于用户和开发者来说都是灾难。以 FastAPI 为例,你看看现在的 PR 列表里都是什么?项目不如改名叫「FastAPI 文档大全」好了。你觉得这样会让提交代码贡献,修复 bug 的人有很好的体验?

blank

FastAPI 有不少 issue 在建议作者创建开发团队,摆脱当前这种低效的维护模式。类似的抱怨有很多,我不想去翻历史,这里仅以置顶 issue 里的一则回复举例:

blank

评论中提到的是这个 PR。一个 bug 在 2022 年就有人试图修复,但是到现在都没有被处理。而且报告相关 bug 的 issue 已经被转换成讨论。最后一条是用户在建议把这个讨论转换回 issue:

blank

没错,FastAPI 本来有几百个 issue(好活跃,对吧),某个时间点被批量转换为讨论,谁知道里面有多少是没有被处理的 bug report。谁知道这 646 个 PR 里有多少是需要被优先处理的 PR。我在 2020 年也提议把文档翻译放到单独的仓库,后来这个 issue 也被转成讨论了。到现在贡献者依然被这个问题困扰

blank

2. 讨论度。也就是博客文章,Stackoverflow等网站咨询和讨论的热度,其实可以感受到,已经没什么人写Flask相关的内容了。

作者写文章是可以随口就来的?博客文章不好统计,那么以 Stack Overflow 来看。抛开问题总数量,因为两个项目创建时间不同。但就提问频率,以上次发推文和现在两次截图的数据来看,和 Flask 相关的问题都创建的更频繁。

FastAPI

blank

Flask

blank

3. 开发迭代的频率。翻一下commits,可以看到Flask只有一个维护者会偶尔修修bug,没有什么大的功能特性开发。

开发迭代的频率和活跃度也是作者强行建立的联系,不过结合 FastAPI 的运作方式,两位作者倒也是「双向奔赴」了。「偶尔修修bug,没有什么大的功能特性开发」有什么问题吗?这就是维护者应该做的事情,大的功能特性又不是每天都有。而且作者是不是没有看 FastAPI 的 commits 历史?你肯定猜不到三千多个 commits 里有一千多是 bot 在更新 changelog。再猜猜 FastAPI 最新一个 release 都有哪些新功能?11 个改动里有 5 个是在更新 README 上的赞助商列表哦:

blank

4. 灵魂人物的影响力。Flask的灵魂人物,也就是项目的发起人其实早就不再参与项目了,搜一下项目贡献记录可以看到Armin Ronacher上次参与开发已经是6年前了。

这条实在不知道说什么好。我创建了项目我就得绑死在项目上直到生命最后一刻是吗?引用一下我在 Twitter 上的回复:

开源项目一定不要创建 GitHub org,项目再流行也要放在自己的账号下。不要成立什么开发团队,PR 要自己慢慢 review,用户抱怨多了,你自然知道哪个 PR 比较重要。还有就是用自己的账号或头像来设置 bot,这样即使你哪天兴趣转移了,用户会以为你一直在参与。斯人已去,灵魂犹在。

我真的佩服 FastAPI 作者这一招用自己的账号来作为 bot,用户以为你在活跃,而这个 PR 哪天能够被 merge 还要多烧几炷香:

blank

一边说自己忙得不行,一边又坚持把项目放在自己个人账号下,坚持自己 review PR。这就是灵魂人物?

后记

终于写完了。没想到只是偶然在一台没有屏蔽推荐首页的电脑上打开了知乎,最后要浪费这么多时间和精力。我想肯定会有人看了开头就急着评论,说「FastAPI 如何好用」或是「Flask 如何不好用」甚至是「Python 不如 XXX」。这些都是离题的讨论,我不完全否认这些观点,也并没有谈及这些。这篇文章只有两个目的:

  • 强调不应该把两者放到一起比较
  • 指出那篇「引战文」中的错误观点和事实偏差,顺便指出一些 FastAPI 的问题

对于程序员来说,你可以使用任何框架,你也可以使用任何编程语言。程序员不就是要随时接受改变,随时学习新的东西吗?没人要你一辈子只能用 Flask 或是 Python。另一方面,即使别人都用 FastAPI 了,我用 Flask 又会怎么样?工具而已,只是按照需要做出适当或喜欢的选择。但是你起码要看一看文章再发表评论,而且也不用看到什么观点就相信什么观点(尤其是没有论据、结论先行的文章)。

同时建议 FastAPI 推介者保留一点体面。新事物的建立不一定要踩在已有事物的坟墓上。挑起对立只会导致 Python 社区的混乱。最后再引述我在上一篇文章的想法作结:

从长远看这些大都是一些临时问题,而且 FastAPI 作者已经开始全职开发开源项目,这些问题在未来应该都会慢慢得到改善。指出这些是希望更多的人可以客观看待 FastAPI,吹捧并不能让一个东西变得更好,参与开发、介绍用法和回答社区提问是比盲目吹捧更有意义的事情。我当然期待 FastAPI 能够越来越好,也期待看到有更多优秀的 Python 框架出现,但我不喜欢过度炒作、盲目的吹捧和错误的对比。


相关链接

PyCon China 2023:濒危 Flask 扩展拯救计划

月初参加了 PyCon China 2023, 做了一个关于 Flask 扩展生态的演讲。不太算是技术分享,讲故事为主。主要的契机是最近尝试把几个失去维护的 Flask 扩展通过各种方式「救」了回来,所以借此机会分享一下经验,也号召大家多多参与开源项目。

演讲介绍

看着一个又一个 Flask 扩展失去维护,不再兼容新版本的 Python 和 Flask,我们能做些什么?在这个演讲里,我会介绍最近我和一些被遗弃的 Flask 扩展打交道的经历,包括如何更新一个古老的 Python 开源项目,以及正在实施中的一个拯救计划。如果你来自其他开源社区,那么这里介绍的经验或许也会帮到你。

录像和幻灯片

P.S. bilibili 认定金正恩的照片是违禁图片,留半秒都不行,最后只好贴了一只马在上面。浪费二十分钟。

照片

blank blank