分类目录归档:Programming

程序员的基本常识——学习篇

这个系列是《软技能》一书的摘抄整理,详细介绍见该系列首篇文章《程序员的基本常识——职业篇》。我会提取书中的有用信息,重新组织,并补充一些想法。欢迎评论补充相关信息,或是纠正错误观点。

对于心智成长,大部分情况下学校和家庭都在帮倒忙,你通常只能靠阅读来完成自我教育。在编程世界里情况类似。你也许会在学校里学习计算机基础知识,但对于大量的编程语言、框架和工具,你通常都需要自学。自学、解决问题和正确提问是程序员必须掌握的几个「元能力」。

1. 学习怎样学习

  • 我们几乎都是下意识地倾向于学习自己感兴趣的东西。主动学习是效率更高的方式。
  • 学习知识最好的方式就是立即将其用于实践。如果关于某个主题你能获得足够的知识,你就可以发挥自己心灵深处强大的创造力和好奇心。当我们能够在一件事情上尽情发挥的时候,我们的内心就倾向于吸收更多的信息,思考更有意义的问题。这种自然的探索和好奇心能够帮助我们轻而易举的记住更多的信息。
  • 一旦你已经实践过,并积累了各式各样的问题,立刻回到书本当中,你会有强烈的冲动去消化吸收其中的内容。
  • 然后,你可以把自己学到的新知识重新应用于实践。已解决实践过程中发现的问题为目标,在向着只是前进的道路上重复这个循环。
  • 最后,你可以通过写作文章或是教给其他人来加深理解。
  • 这个过程可以归纳为「学习——实践——掌握——教授」。

以学习某个 Web 框架来说,从头到尾读完一本相关的技术书,并不会让你掌握这个框架。只有在了解基础知识后,自己动手借助书中的知识编写一个 Web 程序,并尝试尽可能多的解决实际问题,才会让你学会这个框架。

2. 十步学习法

十步学习法的基本思想是先对自己要学的东西有个基本的了解。至少了解以下三个要点:

  • 如何开始:明确你要掌握哪些前导知识,从哪些资料开始最为合适。
  • 学科范围:确定你的学习方向和大致的学习范围。在开始阶段,你不需要了解每一个细节,只需大致了解学科的轮廓。
  • 基础知识:了解最基本的知识点是哪些,知道自己学的哪 20% 就能满足 80% 的日常应用。

1~6 步:前期调研,收集资料,制定学习计划(这些步骤只做一次)

  • 第 1 步:了解全局

了解自己将要学习的主题的全局,建立一个基本的概念。

  • 第 2 步:确定范围

明确自己到底要学什么,有一个可控的学习范围,而不是试图解决太大的问题。让自己的关注点落脚到更小也更可控的范围,根据你的时间预算,尝试把一个大的主题分解为多个可控的子主题。比如,「学习 HTML」可以进一步细化为「学习 HTML 的基本语法,了解页面基本结构和常用的元素」。

  • 第 3 步:定义目标

明确对你来说,学到何种地步,达成何种目标后算是完成学习。好的成功标准应该是具体的、无二义性的。以学习 HTML 为例,「学会用 HTML 编写网页」就是坏的成功标准,而「可以使用 HTML 创建一个内容丰富、语法标准、样式美观并且支持响应式的个人主页」就是一个好的成功标准。

  • 第 4 步:寻找资源

对于学习编程来说,你可以在网上找到大量的资源(这里的资源包括书、教程、视频、代码等)。试着在 Google、YouTube、亚马逊、豆瓣读书或其他网站搜索相关关键字,然后根据描述或评论选择资源。尽量选择系统性的教程或书。对于编程语言、框架和工具来说,官方入门教程一般都不会太差。

  • 第 5 步:创建学习计划

学习计划就是你的学习路径,通常你可以根据相关主题的技术书的目录来制定学习路径。好的技术书都遵循这样的规律:打好基础,做好铺垫,然后逐个展开每一章的论述。通过对比几本同类型的书籍目录,制定专属于你的学习路径。

  • 第 6 步:筛选资源

根据你的学习计划,去掉重复、无用、过时、难度不适宜的资源。只留下 1~2 个品质最高的资源即可。

7~10 步:学习——实践——掌握——教授(循环往复)

  • 第 7 步:开始学习,浅尝辄止

获取刚好足够开始动手实践的基础知识。大多数人在学习过程中通常会犯两类错误:第一类错误是在知之不多的情况下就盲目开始,即行动太早;第二类错误是在行动之前准备过多,即行动太晚。

  • 第 8 步:动手操作,边玩边学

通过动手实践验证你在前一步骤学习的知识,并记录下新的疑问。比如,做一个简单的小项目。

  • 第 9 步:全面掌握,学以致用

根据你掌握的资源,解决你在实践中记录下的大量问题。同时深入了解各个主题。比如,阅读你要学习的语言、框架的源码。

  • 第 10 步:乐为人师,融会贯通

要想确定你确实掌握了某些知识,最好的方式就是把自己学到的知识教给别人。你可以在 Stack Overflow、论坛、IM 群组里回答问题,也可以写文章或录视频。把自己所学教给别人是查漏补缺的好办法,这同时也会增强你的表达能力和理解能力。

3. 寻找导师

  • 在你的软件开发生涯中,拥有一位导师可以说是一笔巨大的财富,因为一位优秀的导师能够让你无需亲身经历现实的重重考验就拥有丰富的经验,从而更高效的掌握某种技术。
  • 我们通常会犯这样的错误——根据他人的生活来判读其是否具有帮助我们的能力。然而,最好的老师往往深藏不露。你不应该因为某人在自己的生活中成就平平,或者看起来不过如此就对他的印象大打折扣。
  • 你可以找一位已经成功实现你想要做的事情的人,也可以找一位曾经帮别人实现了你现在想要做到的事情的人。
  • 导师未必一定得是非常厉害的专家,只比你领先一步的人也值得学习。
  • 你可以在本地的开发小组或是网上的论坛等地方寻找你的导师,也可以在你的公司或交际圈里寻找,或者通过付费向行家请教。
  • 优秀的书籍也可以做你的导师。
  • 在寻找导师之前,你必须要明确两件事,第一是你需要导师帮你解决什么问题;第二是为了能够换取导师的帮助,你能给他提供什么?

4. 乐为人师

  • 成为导师可以让你受益无穷。
  • 每个人都有教的能力:只要在某些地方快人一步,就能帮助别人。
  • 有时候你给比人做导师真正要做的就是给予关注。我们在生活中都需要别人的帮助以看到自己看不到的东西,因为当遇到涉及自身的问题和麻烦的时候,我们都会有些目光短浅。
  • 教授是学习的最佳途径之一。当你担任导师的时候,你会以全新的视角观察和思考,并面对更多有挑战的问题。在探究答案的过程中,你会愈加深入思考,发现自己的漏洞,甚至完全改变最初的想法。
  • 一旦我们试着向别人解释某件事情的运作原理或背后的原因的时候,我们在认知上的漏洞就会暴露出来。
  • 最好的教学方式就是以谦虚的视角来观察问题,以权威的口吻去诠释问题。你要明白,你教的目的是为了帮助别人,而不是为了证明自己的优越性或者寻求认可。
  • 除了写博客,录视频和演讲也是很好的教学方式。演讲时要心态谦卑,信心满满(而不是傲慢自大)。

5. 学历

  • 拥有(好的)学历并不是成功所必须的,但它限制了可以提供给你的职位数量,并且某种程度上也限制了你的晋升。
  • 学历教育可以提供一个相对完善的计算机基础教育。当然,这些知识你也可以通过自学获得,不过这需要花费大量的时间。
  • 如果你没有(好的)学历,那么就通过作品来证明你的能力。比如,你可以写博客,独立开发一个程序,在 GitHub 上创建或参与开源项目,或是在 Stack Overflow 回答问题。
  • 弥补措施是,你可以通过自考获得一个学位,大概需要花费两年的业余时间外加两千块的投入。

6. 知识短板

  • 专注于自身强项,这没什么不妥,但有时候,如果弱点得不到解决,通常会成为你的职业或生活的桎梏。
  • 准确识别短板的最佳方式之一就是看看自己在哪些工作上花费了大量的时间,或者一直进行重复性劳动。比如,学习操作系统或各类软件的快捷键就可以节省大量时间;编写宏或自动化脚本来简化各种软件或系统中的重复操作。
  • 维护一份清单,列出自己需要去研究或者不清楚的事物。

本文首发于公众号「李辉的代码厨房」。

程序员的基本常识——职业篇

这个系列是《软技能》一书的摘抄整理。这本书名声在外,读过后发现并没有那么好。一来是内容比较水,废话太多;二来掺杂着大量的俗套励志段落,还包含一些不靠谱的建议(理财)。

尽管如此,经过提纯后,书里还是有一些有价值的信息,可以算是程序员基本常识。对刚刚入行,或是打算做程序员的人来说会比较有帮助。

这个系列会有 4 篇文章,分别对应职业、自我营销、学习和生产力 4 个主题。我会抽取书中有价值的部分,适当进行改写和扩充。欢迎评论补充相关信息,或是纠正错误观点。

1. 绝不要做他人都在做的事

  • 对待职业的首要原则:程序员要主动管理自己的职业生涯,「工作是属于公司的,而职业生涯却是属于你自己的」。
  • 当你为了谋生一头扎进写代码的世界时,其实你和中世纪小镇上开铁匠铺的铁匠没什么差别。
  • 把自己当做是一个公司,而不是打工者。把雇主当做是你的软件开发企业的一个客户。你的工作就是出售你提供的服务。
  • 集中精力成为一位专家,专门为某一特定类型的客户提供专业的整体服务。你只有真正专注于一类客户,才能找到非常好的工作。

2. 必须要设立自己的人生目标

  • 为了安逸,我们倾向于遵循已经设计好的路线。缺乏对人生目标的具体认知。「死都不怕,就怕不安逸。」
  • 大目标必须足够清晰,比如你希望自己 5 或 10 年后在哪里,获得怎样的成绩。最好把大目标写在纸上,放在每天能看见的地方。
  • 逆向反推,将大目标分解为每年、每月、每周、每日的小目标。
  • 定期检查和调整目标。

3. 选择职业类别

可选项通常有三种:

类别 好处 坏处
雇员 稳定的收入;相对轻松的工作 固定的收入;不自由
自由职业(比如做外包、培训、咨询) 自由;有赚钱的潜力 考验自制力;应付更多的事情;可能会找不到项目
创业 巨大的赚钱潜力;完全自由 风险巨大;需要学习大量的技能,包括市场营销、管理、财务等;可能需要长时间高强度工作

通常情况下,你会先做一份全职工作,积累了实力和各类资源后,再考虑尝试自由职业或创业。确保你做好了准备,比如积攒了能够维持数年开支的积蓄,以便应对没有稳定收入的情况。

你可以在业余时间启动你想创建的业务,等能从这项业务中产生足以维持生计的稳定收入时,再考虑辞职。采用这种方式时,确保你和公司签订的劳动合同里没有规定你的所有工作成果(包括业余时间,或是使用公司资源的情况下)都归公司所有,如果有相关条款,可以考虑咨询律师。

4. 选择技术方向

  • 对于自由职业 / 创业者来说,通常会选择有潜力的小众市场。这对选择技术栈同样适用,尝试在一个专业方向上拥有专长(专业化),比如 Python 开发、Python Web 开发、Python 特定 Web 框架开发三者的专业化程度逐渐递增。
  • 专业化的规则是:专业化程度越深,潜在的机会就越少,但获得这些机会的可能性越大,竞争者也更少。
  • 可以尝试发展两个方向,选择这两个方向的交叉点作为职业方向。比如会 Excel 的老师,会英语的导游,会编程的律师,都要比普通的老师、导游和律师更有竞争力。
  • 但同时注意不要只会某种语言和专业方向,否则会因为行业变化而被淘汰。先从专业化开始,再拓展分支。
  • 避免陷入对某一技术的狂热之中,这会让你在职业生涯之路上走得更远。不要试图寻找最好的语言、框架、操作系统和文本编辑器,更没必要为此浪费大量时间进行争论。
  • 对技术保持开放的心态,而不是固守自己已经了解的技术,声称它是最好的,你会发现更多的机会为你敞开大门。

5. 选择公司

类别 好处 坏处
小公司(创业公司) 面临更多的挑战;容易建立影响力;回报潜力大 可能会身兼多职;工作强度大;稳定性差
中型公司 工作稳定;加班较少 变化很慢;没有机会使用前沿技术
大公司 完备的流程和规范;培训机会多;大型有影响力的项目 官僚主义;只负责代码库的一小部分;很难获得关注

考虑自己适合哪一种公司,可以在工作前和目标公司的雇员聊一聊。

6. 破解面试之道

  • 让面试官对你怀有好感会有助于通过面试。方式有很多,包括:

    • 提前建立个人品牌
    • 提前熟悉目标公司的员工
  • 内推有推荐人的声望背书,会更容易获得面试机会。
  • 想办法与公司内部人员建立联系,比如参加本地开发小组和行业会议,在论坛、IM 群聊、社交网站、GitHub 上建立联系。
  • 面试的时候,你要集中精力证明自己就是无需监督也能自动自发做好事情的员工;同时还必须要证明:在技术上你确实胜任工作;最好还能说服面试官相信你非常能干,不会被困难阻挡。

7. 获得晋升机会

  • 在任何公司里能让你脱颖而出的最重要法宝就是承担更多的责任。

    • 没有人愿意涉足的领域是搜寻机会最好的地方。
    • 成为团队中其他人的导师,建立声誉。
    • 增加自己的曝光度:做内部分享,发表意见,解决技术难题。
  • 关于办公室政治:尽管不能完全避开,但至少应该知道会发生什么,哪种人需要避开,那种人永远不要有交集。
  • 如果脚踏实地努力后仍然无法晋升,可以考虑换工作。

8. 成为专业人士

成为专业人士能帮你获得更好的工作和更多的客户:

  • 遵守自己的原则。
  • 专注于正确完成工作。
  • 不惧怕承认自己错了,不会文过饰非。
  • 持续稳定。
  • 勇于承担责任。
  • 完善自己,迎接挑战,而不是降低标准。一旦你越多了底线,选择妥协,就很难回头。

9. 成为自由职业者

你为自己工作的时候通常会比为别人工作时更加努力,但热情通常不会持续很久,你每天真正工作的时间也没有你想象的那么多。缺乏监督可能会让你长久的陷入拖延和偷懒的境地,为此你需要:

  • 学习时间管理,并建立一系列日常原则。
  • 自我激励,培养自制力。尽量排除干扰和诱惑,让它们远离你的工作环境。
  • 适应孤独感,并适时的走出去,参见开发者聚合或行业会议,和其他从业者交流。

获得客户的最佳途径:吸引式营销(inbound marketing)。简单来说,就是免费提供有价值的东西。通过写博客、录视频和播客、演讲等方式提供与自己的服务相关的有价值的内容(大多是免费的)。

你的收费标准应该按照全职工作的两倍时薪收取,因为你通常需要自己缴税,购买商业软件。如果你的工作能够为客户带来更大的价值(提高他们的业务或是节省大量开支),你可以根据你能带来的价值来定价。记得向客户说明为什么你的服务值这个价格。

如何创建你的第一个产品:

  • 不要在没有找到客户之前就构建产品。
  • 一个产品要解决何种问题,以及目标受众是哪些人,这些问题必须在创建产品之前就弄明白。多和目标客户沟通交流,不断检验自己的想法。
  • 捷径是提前在对应的领域建立影响力,通过创建博客,演讲等方式发展受众。
  • 通过测试市场来验证你的产品,看看你的潜在客户是否真的愿意为它买单。比如进行一场预售,为提前付费的客户打折,看看有多少人愿意买单。
  • 如果是创业产品,那么就从小处着手,关注核心功能实现,快速建立产品原型并上线,及时获得反馈并不断改进,想法行不通就及时脱身。你可能需要重复多次这个过程才能创建一个成功的产品。

10. 成为创业者

  • 创业拥有巨大的潜在回报,但也极其危险。
  • 大多数创业公司的创始人都有所谓的退出策略,比如:

    • 当公司成长到一定规模的时候被收购
    • 上市
  • 当你有了一个好点子,有技术或是有技术合伙人,你最好还要拥有独一无二的知识产权或行业资源,这可以确保你的产品不会被大公司快速复制。而且你的项目要有规模扩张的潜力。
  • 除了持谨慎策略的自力更生型创业公司外,大多数初创公司都希望获得外部投资以快速成长。在开始的时候可以尝试申请加入创业孵化器计划。
  • 对创业公司来说,第一个重要里程碑就是获得第一笔资金(种子资金),一般天使投资人会投给早期创业者,即种子轮 / 天使轮。拿到天使投资后你可以雇佣员工,开始扩张。
  • 种子基金烧光后,如果你的点子仍然可行,将会获得第一轮投资(A 轮),风险资本通常会在这一轮介入(风险投资人 / 风投)。这之后,大多数创业公司还会经过几轮融资,最后成功实现盈利,或者被收购。 

本文首发于公众号「李辉的代码厨房」。

《Flask 入门教程》后记

恭喜,你已经完成了整个 Flask 入门教程。不出意外的话,你也编写了你的第一个 Web 程序,并把它部署到了互联网上。这是一件值得纪念的事,它可以作为你的编程学习之路上的一个小小的里程碑。继续加油!

留言 & 打卡

如果你完成了这个教程,可以在 HelloFlask 论坛上的这个帖子留言打卡,欢迎分享你的心得体会和经验总结。如果你对这本书有什么建议,也可以在这里进行留言反馈。

讨论与求助

如果你想和其他同学交流 Flask、Web 开发等相关话题,或是在学习中遇到了问题,想要寻求帮助,下面是一些好去处:

付费支持

本书采取自愿付费原则,价格为 10 元。如果你愿意,可以通过付费来支持我,让我有更多的时间和动力写作 Flask 教程和文章。你可以通过支付宝账号 withlihui@gmail.com 转账,或是扫描下面的二维码付款。

支付宝二维码 / 微信二维码

qr_alipayqr_wechat

进阶阅读

说来惭愧,在这本教程几乎每一章的结尾,我都会提到《Flask Web 开发实战》,每次写到这里,我都觉得自己好像在写“问候家明”。所以,最合适的进阶读物我已经推荐过很多次了。除了这本书,其他的进阶读物如下:

未完待续

你喜欢这本书以及这本书的写作模式吗?

如果有足够的人喜欢的话,或许我会考虑写一本包含 Flask 进阶知识的《Flask 进阶教程》。按照设想,在这个进阶教程里,这个 Watchlist 程序变成一个支持多人注册和使用的简化版豆瓣电影 / IMDb。同时介绍各类常用扩展的使用和 Flask 上下文、蓝本等进阶知识。

再或者,这个教程或许会升级为一本完整的书,使用类似的编写模式,引入一个更加丰富有趣的程序,包含优化后的入门知识和 Flask 进阶内容。

如果你期待这样一本进阶教程 / 书的出现,欢迎让我知道。你可以在打卡 & 留言贴发布留言,或是直接发邮件(withlihui@gmail.com)告诉我。

写作一本技术书,能给一个社区带来哪些改变?

写作《Flask Web开发实战》花费了一年多的时间,在这期间,除了编写5个项目实例和写作外,我还花了一部分时间来和书中涉及的Python库(主要是Flask扩展)打交道。这篇文章总结了这本书的写作给整个Flask社区带来的一些改变。

国内第一本Flask书

虽然国内已经有几本书介绍过Flask,但都是顺便介绍,而不是真正意义上的Flask书。因此,这本书可以说是国内第一本Flask书,很高兴能为国内的Flask社区带来这样一本书。希望这本书能够推动更多人了解和使用Flask,进而为社区贡献更多的力量。

完善多个开源项目

在实际介绍和使用某个库时,总会遇到各种各样的问题,主要有两类:

  • Bug
  • 不完善的用法或实现

Bug不用多说,肯定要处理。对于不完善的用法和实现,如果沿用原来的代码,一来不容易读者理解,二来还需要在书中加进很多不必要的内容。所以,我更倾向于让这些代码变得更好一点。

如果把不完善的实现写到书里,我会觉得非常不舒服。比如说,WTForms本身是支持设置内置的错误消息的语言的,我们可以设为中文,而不用手动写错误消息。但是在Flask-WTF中,因为内部重写了相关方法,导致没法在不使用Flask-Babel的情况下使用内置的翻译。问题来了:如果在第4章介绍Flask-Babel和i18n等相关概念的话,这显然需要占据大量篇幅,并不合适,而且这部分内容已经计划加入到第10章。

为此,书的安排没法改动,那么只好调整Flask-WTF的内部实现,所以就有了这个PR。类似的情况还有很多,比如Firefox支持headless模式后,Selenium中却没有提供和Chrome相同的导入接口;Flask-OAuthlib中,传入access令牌只能使用元组或字典类型,而不能使用更直观的字符串变量传入……

下面是一些写作期间提交的开源贡献:

当然,如果加上其他没有太大意义的文档更新,这个列表还可以更长。
 
值得特别说明的是Werkzeug的这个PR,这个PR对应的bug困扰了我很长一段时间。一开始我把问题归咎到python-dotenv身上,还创建了一个PR(#101),但是维护者迟迟没有回复。后来再次研究,发现可以直接在Werkzeug内部解决,于是创建了#1320,然后被lepture用更好的实现取代了(#1321)。不过,在python-dotenv创建的那个PR倒是促成了Pipenv的这个PR(#2386)。

推动发布新的版本

除了让PR被合并,还要让这些项目发布新的release,这样才能在项目源码公开后,让读者可以正常使用。在我的推动下,Flask-OAuthlib、Flask-Whooshee和Flask-Moment都发布了新的版本。

其他的项目,除了Werkzeug以外,大部分都在整个写作的时间跨度发布了新的版本。尤其重要的是Flask的1.0版本。从书一开始写作,我就直接采用了主分支的代码,书中我直接将版本号写为0.13。如果Flask迟迟不发布新版本,那我会陷入一个很尴尬的境地:要么大胆采用主分支代码,但是可能会出现变动,导致书中的内容不可靠;要么采用旧版本,那书出版后可能会很快面临过时的危险。还好,在写作接近尾声的4月末,新版本1.0发布了。

4个Flask扩展

用于集成Bootstrap的扩展Flask-Bootstrap目前的维护状态很糟糕:上一次release是17年1月,上一次合并commit是17年3月,而且已经很长时间不再处理PR和Issue。

原项目还存在很多问题:Jinja语法不标准、内置基模板引入不必要的复杂度、分页宏不支持传入URL片段值。除此之外,让我决定写新的扩展替代它的最主要原因是因为它不支持Bootstrap 4,而我不能接受在书中引入一个这样过时的项目。

为了解决这些问题,只好写了Bootstrap-Flask。最终决定写替代扩展的时候,书已经完成了三分之二,大量旧的内容和源码都要改写。把书稿和源码从Flask-Bootstrap和Bootstrap3迁移到Bootstrap-Flask和Bootstrap4是一个非常痛苦的过程,到现在还记忆犹新……

对于某些空白的领域,我写了三个扩展来简化集成操作:

5个Flask开源项目

在此之前,完善的Flask开源项目屈指可数,除了Flask官方提供的两个示例程序外,就只有Miguel Grinberg的两个程序。而这本书带来了5个相对比较完善、所有依赖都基于最新版本的开源项目(严格来说,第1个程序比较简单,可以排除在外):

PyCon China 2018:自由的Flask

这是我在PyCon China 2018的主题演讲。这个演讲并没有涉及太多复杂的内容,主要的目的还是想推介一下Flask,让更多的人能够了解和使用Flask。

演讲主题简介如下:

作为一个流行的Python Web框架,很多开发者都喜欢Flask的简洁和灵活,并且常常拿它和“笨重”的Django做比较。基于这些特点,我们可以说Flask是自由的,自由的Flask会让你的Web开发更加自由。具体来说,这里的自由表现在很多方面,包括程序功能的扩展、路由的定义、项目结构的组织以及程序模式的设计等。

相关资源:

blank

《Flask Web开发实战》勘误、源码等资源索引

这篇文章列出了本书的勘误、源码等相关资源。衷心的希望这本书能够帮助到你,同时也为书中包含的错误为你带来的不便说声抱歉。

勘误 & FAQ & 可改进实现 & 版本更新记录

在本书的Meta仓库helloflask(https://github.com/greyli/helloflask)中,你可以找到下列资源:

实战项目源码

本书第7~11章的5个实战项目的源码地址如下:
这些项目的介绍以及在线Demo链接可以在本书主页找到。

其他相关资源

本书附带的其他相关资源如下:

HelloFlask.com

helloflask.com是本书的衍生站点,以上的资源信息都可以在本书的主页http://helloflask.com/book找到。

问题与错误反馈

如果你发现了书中的错误和不足,或是有和书相关的问题和反馈,根据类别,你可以分别选择下面的途径告诉我:
  • 书中包含的笔误、错误和不足的反馈:在helloflask仓库创建issue或PR
  • 各个项目的bug:在各个项目所在的仓库创建issue或PR
  • 其他问题、建议和批评:直接发邮件给我(withlihui@gmail.com),或是发送知乎私信、新浪微博私信、Twitter私信给我(邮件可以被我最快看到)

Powered by This Book

如果你通过阅读整本书编写了自己的小项目,欢迎通过各种方式告诉我,我会把你的项目添加到本书主页中的“Powered by This Book”栏目。
 
最后,欢迎大家在新浪微博或Twitter上关注我,以便及时获取本书的最新动态。

《Flask Web开发实战》第二部分项目Demo和源码上线

很抱歉,因为电子书突然提前上架,一些进度被拖延了,现在终于把所有项目的源码都推送到GitHub了(如果你不方便访问GitHub,本书主页上提供了这些项目的源码合集文件下载)。

下面是这些项目的源码和Demo链接。关于这些项目的截图和功能介绍参见《Flask Web开发实战》中的示例程序们或本书主页(helloflask.com/book)。

第1~6章、13章:HelloFlask

第7章:留言板 – SayHello

Say hello to the world.

第8章:个人博客 – Bluelog

A blue blog.

第9章:图片社交网站 – Albumy

Capture and share every wonderful moment.

第10章:待办事项程序 – Todoism

We are todoist, we use todoism.

第11章:在线聊天室 – CatChat

Chatroom for coders, not cats.

提示 在线Demo部署在DigitalOcean的廉价主机上,某些地区或在特定时段可能会无法访问,请尝试使用VPN。另外,在线Demo关闭了部分功能。建议根据书中第二部分每章开始的操作指导在本地运行程序。

特别说明(给使用Windows系统的Python2.7用户)

Werkzeug当前版本(14.2)存在一个Bug,当在Windows系统下使用Python2开启调试模式时,重载器会因为环境变量FLASK_ENV的编码问题而出现TypeError异常。这个Bug已在master分支修复(话说定位这个Bug花了我很长时间),预计在纸书正式发售前会发布Werkzeug 0.15版本。

目前,临时的解决方案有修改Werkzeug源码、修改python-dotenv源码、从GitHub上的master分支更新Werkzeug等,但这些方法都太麻烦。我建议你临时不开启调试模式来避免这个异常出现,也就是在.flaskenv文件中将FLASK_ENV定义那一行注释掉(使用#号),比如:

# FLASK_ENV=development

等到Werkzeug 0.15发布后,我会发一篇文章通知大家更新本地依赖,并给出具体的更新方法。

致购买《Flask Web开发实战》电子版的读者

按照编辑的说法,电子书是要和纸书一起发售的。没想到的是,纸书还在印刷的时候,电子书突然就在24号上架了……这个“突袭”带来了一些问题,这篇文章汇总了这些问题及对应的解决方法。很抱歉这些问题为你带来了不便!

电子书亚马逊链接:https://www.amazon.cn/dp/B07GST8Z8M

豆瓣阅读链接:https://read.douban.com/ebook/56335667/

排版错误

或许是因为排版人员不够专心,又或者是软件问题,电子书存在一些排版问题:

  • 文本中所有的半角括号被转换为全角括号
  • 类似“python -m”命令中的空格被去掉
  • 部分代码缩进错乱
  • 部分字符缺失

我这几天会大致的过一遍电子书,汇总出所有的排版问题,然后尽快推送更新。

你可以访问勘误文件查看完整的勘误列表。

运行程序时出现TypeError异常(针对在Windows系统使用Python2的用户)

更新 python-dotenv 到最新版本即可:

$ pip install -U python-dotenv

《Flask Web开发实战》签名版开始预售

《Flask Web开发实战》即将下厂印刷,如果想要购买作者签名版,可以访问http://helloflask.com/book/signed。本书定价129,电商平台预计价格为99,签名版为109。

blank

注意,此商品为预售,无现货,具体发货时间取决于本书正式发售日期。更多信息请访问预售页面查看。

Flask Web开发实战番外

《Flask Web开发实战》删减下近8万字的内容,有时间我会把其中有价值的内容整理成文章发布出来。

《Flask Web开发实战》中的实战项目

很多朋友对《Flask Web开发实战》中的项目实例很感兴趣,这篇文章就来简单的对这些项目进行介绍,并给出一些截图。这几个项目的源码和在线Demo链接均可以在helloflask.com看到。

第1~6章及13章:helloflask

Hello, Flask!

第1~6章以及第13章的示例程序统一包含在helloflask仓库中的demos目录下。另外,这个仓库也作为《Flask Web开发实战》的仓库,书的勘误文件等内容也会一并在这里更新。

Flask Web开发实战第6章电子邮件示例程序

Flask Web开发实战第6章电子邮件示例程序

Flask Web开发实战第5章数据库示例程序

Flask Web开发实战第5章数据库示例程序


第7章:留言板 – SayHello

Say hello to the world.

这个项目比较简单,主要用来介绍项目组织和Web程序开发流程,没有复杂功能,介绍了虚拟数据的生成和时间日期的本地化。

SayHello绝对时间弹窗

SayHello绝对时间弹窗

SayHello主页

SayHello主页

第8章:个人博客 – Bluelog

A blue blog.

一个基础的博客程序,使用工厂函数和蓝本组织程序,主要包含下面这些功能点:

  • 使用工厂函数创建程序实例
  • 使用蓝本模块化程序
  • 使用富文本编辑器
  • 创建文章/分类/评论
  • 编辑文章/分类
  • 删除文章/分类/评论
  • 回复评论
  • 管理后台
  • 文章分类
  • 文章分页
  • 博客设置
  • 用户认证
  • 网站主题切换

博客主页

博客主页

更换了主题的博客主页

更换了主题的博客主页

博客后台的文章管理页面

博客后台的文章管理页面

第9章:图片社交网站 – Albumy

Capture and share every wonderful moment.

一个进阶的程序实例,主要包含下面的功能点:

  • 大型项目组织形式
  • 用户注册流程
  • 用户角色和权限管理
  • 图片上传
  • 图片处理
  • 删除确认模态框
  • 图片分类
  • 图片标签
  • 用户资料弹窗
  • 图片收藏
  • 用户关注
  • 在资料弹窗中执行关注操作
  • 消息提醒
  • 消息提醒的实时更新
  • 生成随机头像
  • 用户自定义头像
  • 更改密码
  • 提醒消息开关
  • 收藏可见开关
  • 注销账户
  • 全文搜索
用户个人主页

用户个人主页

网站动态页面

网站动态页面

评论中的用户资料弹窗

评论中的用户资料弹窗

头像裁剪

头像裁剪


第10章:待办事项程序 – Todoism

We are todoist, we use todoism.

一个简单的待办事项程序,使用jQuery实现简单的单页效果,主要包含下面的功能点:

  • 单页程序
  • 国际化和本地化支持
  • 实现Web API
程序主页

程序主页

切换语言后的程序主页

切换语言后的程序主页


第11章:在线聊天室 – CatChat

Chatroom for coders, not cats.

一个使用Flask-SocketIO实现的聊天室,主要包含下面这些功能点:

  • Gravatar头像
  • 实时双向通讯
  • 第三方登录
  • 无限滚动加载历史消息
  • Markdown支持
  • 代码语法高亮
  • 标签页消息提醒
  • 浏览器桌面通知
聊天页面

聊天页面

登录页面

登录页面

代码语法高亮

代码语法高亮


第15章:Flask扩展 – Flask-Share

Create social share component in Jinja2 template based on share.js.

Flask-Share是一个基于share.js实现,可以在模板中方便的创建社交分享组件的扩展。

创建社交分享组件

创建社交分享组件

一本更好的Flask书——《Flask Web开发实战》

如果你想了解这本书的最新动态,可以关注我的公众号、Twitter 或豆瓣,也可以访问本书主页 http://helloflask.com/book。

欢迎加入 HelloFlask 论坛、QQ群(419980814)讨论相关话题。

购买方式

欢迎访问本书的豆瓣图书页面撰写书评或短评。

电子书各平台的排版效果不一,购买前请先进行试读。

为什么说这是一本更好的Flask书

现有的几本Flask书包含下面这些问题:
 
  • 内容较旧,不论是Flask本身,还是其他扩展和Python库。
  • 包含误区或不完善的代码实现,比如在使用SQLAlchemy建立数据库关系时,出于性能的考虑,一般不会把加载关系记录的方式设为dynamic。
  • 示例程序过于简单,比如甚至没有删除帖子的功能。
  • 内容比较单一,仅包含入门知识。
相对的,这本《Flask Web开发实战:入门、进阶与原理解析》当然避免了以上问题:
 
  • Flask使用最新的1.0.2版本,使用Pipenv管理示例程序依赖,所有扩展和其他Python库均使用最新版本。不仅如此,项目中使用的前端框架Bootstrap(4.1)、Materialize(1.0)和Semantic-UI(2.3)也均使用最新版本。
  • 纠正了常见误区,并在相应位置给出提示。
  • 包含多个不同复杂程度的示例程序,尽可能的让程序贴近真实使用情况。
  • 如副书名所示,这本书除了基本的入门知识,还包含进阶内容和原理解析。
看到书名,你的第一想法也许是:为什么书名和Miguel Grinberg的书那么像?起书名并非由我一人决定,而且技术书的起名没有多大自由度,你不仅要考虑加入合适的关键词,还要考虑到如何凸显书的主要特点。“Flask Web开发”的确是简洁又突出重点的好名字,我们在后面添加了“实战”,用来着重体现这本书的最大特点。

3个推荐语

这本书内容翔实,推荐给想要系统学习Flask的人。不要漏掉书中的小知识点哦。
             —— Flask开发团队(Pallets)核心维护者 Hsiaoming Yang(lepture)
这本《Flask Web开发实战》非常有趣,是一本能够给读者带来帮助的书,作为一个Flask框架的爱好者,我也很期待这本书的出版。
—— 《Redis设计与实现》作者 黄健宏(huangz)
Grey Li is a really helpful contributor to Flask and the Python community. He is making it easier for more people to learn and use Flask.
—— Flask开发团队(Pallets)核心维护者 David Lord(davidism)

8个示例程序、5个项目实例、1个扩展

包含丰富的实例是这本书的最大特点,这也是为什么要把“实战”放到书名里。
 
书的第一部分(基础篇)共6章,每一章都包含一个示例程序,示例程序包含每章涉及的大部分代码,你可以实际运行程序来查看效果。以第5章《数据库》为例,除了一个简单的演示“增删查改”的笔记程序外,示例程序中还包含“一对多”、“多对一”、“一对一”、“多对多”、“一对多+双向关系”、“一对多+双向关系+使用backref简化关系定义”、“级联设置”“数据库时间监听函数”等15(2 * 7 + 1)个模型类定义和2个事件监听函数(两种实现方式)。
第1~6章以及第13章的示例程序统一包含在helloflask仓库中的demos目录下。
第二部分(实战篇)共5章,每一章都通过一个程序来组织起所有的知识点。这5个程序分别为:留言板SayHello、个人博客Bluelog、图片社交网站Albumy、待办事项程序Todoism和聊天室CatChat。你可以在下面的《章节概括》部分查看每一个示例程序所涉及的知识点。
和《Flask Web开发》中的做法类似,这部分的示例程序均使用Git标签来组织不同阶段的代码,方便你签出相应的版本或是进行对比。
第三部分(进阶篇)第13章《性能优化》通过两个实例程序来介绍使用Flask-Caching和Flask-Assets对Flask程序添加缓存和进行静态资源优化的前后变化对比。第15章《Flask扩展开发》则通过一个简单的为页面中添加社交分享组件的Flask-Share扩展来完整介绍从创建Git仓库到使用twine将包上传到PyPI的完整扩展开发流程。
你可以在文章《Flask Web开发实战》中的示例程序们一文中了解这些程序的具体信息,其中包含大量程序界面截图。
这几个项目的源码和在线Demo链接均可以在helloflask.com看到。

满足80%的读者提议

在文章《写一本Flask书》中,很多知友通过评论给出了希望看到的内容和建议。我做了简单的收集和处理,粗略的浏览,大概有80%的读者提议得到了满足。

内容丰富,大约700页

这本书在介绍基础知识外,还引入了许多进阶技巧。第一部分从第2章开始每一章都包含一个《进阶实践》章节,其中包含一些常见的技巧,比如“如何安全的跳转回上一页”,“使用WTForms表单内置的中文错误消息”,“数据库事件监听”等,具体可以参考下面的《目录》部分。
 
另外,这本书还介绍了一些被其他Flask书忽略,但又非常实用的知识,比如实现AJAX时Flask和JavaScript交互数据的方式、通过AJAX实现的资料弹窗、在弹窗中实现动态的关注收藏按钮、通过AJAX实现简单的单页程序、实时双向通讯、国际化和本地化、全文搜索、第三方登录、Markdown支持、代码语法高亮、头像裁剪、设置缓存等。
 
本书会尽量提供多个技术选型,比如第6章《电子邮件》中,除了介绍使用Flask-Mail实现发送电子邮件,还介绍了使用事务邮件服务SendGrid发送电子邮件的两种方式;在第14章《部署上线》中,我介绍了一个基本的服务器初始化过程,包括安装基本的而库、设置SSH密钥登录、设置防火墙等部署,接着才是Gunicorn、Nginx和Supervisor的使用介绍。除了Linux部署,还介绍了使用PythonAnywhere和Heroku的程序部署流程。
 
尽管如此,在多次修改的过程中,我还是删掉了大量内容(近8万字约240页):
 
  • 在Flask程序中使用Celery
  • Fabric自动化部署
  • 使用Tox自动化测试
  • 使用Sentry处理日志
  • 使用Docker开发和部署Flask程序
  • NoSQL数据库的使用介绍
  • 使用Frozen-Flask静态化处理程序
  • 静态部署
  • Flask-SSE的使用
  • Travis CI、Coverall的使用
  • 使用GitHub-Flask集成GitHub登录
这些内容或是偏离主题,或是有了更好的替代内容,删掉这些内容一方面可以保证书的内容贴近主题,同时也可以避免成书太厚。因为内容丰富,所以最终完稿共980页,成书大概会在700页左右。
对于这些删减掉的内容,我会抽取有价值的内容并进行完善后陆续发布在专栏中。

关于我

我是李辉,一个Python开发者,Flask开发团队(Pallets Team)的成员。我在GitHub上维护了几个Flask扩展项目,也尝试为多个Flask相关项目贡献代码和处理Issue;除了知乎,我偶尔会在Stack Overflow上回答一些Flask相关的问题。如果你想了解我的项目或书的最新动态,可以关注我的Twitter或新浪微博账号。

章节概括

下面是本书的章节概括,简单的介绍了各章的内容,你可以通过下面的《目录》部分来了解详细的内容。本书由四部分组成,分别为基本篇、实战篇、进阶篇和附录,共16章。本书的章节安排经过精心的设计,力求让读者可以循序渐进的掌握Flask开发基础知识和技巧。
 
第一部分:基础篇 介绍Flask开发相关的基础知识。
 
  • 第1章:搭建开发环境,编写一个最小的Flask程序并运行它,了解Flask基本知识。
  • 第2章:介绍了Flask与HTTP的交互方式以及相关的Flask功能。
  • 第3章:Jinja2模板的使用和技巧。
  • 第4章:Web表单的创建和表单数据的验证。
  • 第5章:在Flask程序中使用数据库进行CRUD操作,各类数据库关系的建立。
  • 第6章:在Flask程序中发送电子邮件的几种方式,使用Flask-Mail通过SMTP服务器发送,或是通过事务邮件服务SendGrid(SMTP和Web API两种方式)。
第二部分:实战篇 通过几个示例程序来介绍Flask开发中的各类功能实现和技巧。
 
  • 第7章:通过一个简单的留言板程序SayHello介绍Web开发基本流程和基本的项目管理方式,对第一部分的基础知识进行简单的回顾,最后还介绍了Faker、Flask-Moment和Flask-DebugToolbar的使用。
  • 第8章 :通过个人博客程序Bluelog介绍CRUD操作、用户认证(Flask-Login)、文章评论和回复、后台管理等功能,其中还包括网站主题更换,渲染导航链接等小技巧。
  • 第9章:通过图片社交程序Albumy介绍用户注册和认证、用户权限管理、图片上传(Flask-Dropzone)与处理(Pillow)、用户头像、复杂的数据库关系、复杂的数据库查询、全文搜索(Flask-Whooshee)等内容。
  • 第10章:通过待办事项程序Todoism介绍单页应用、国际化与本地化(Flask-Babel)、Web API、OAuth服务器端实现等内容。
  • 第11章:通过聊天室程序CatChat介绍Websocket应用(实时双向通讯,通过Flask-SocketIO实现)、OAuth客户端实现(第三方登录,通过Flask-OAuthlib实现)、Markdown支持(markdown)、代码语法高亮(pygments)等内容。
第三部分:进阶篇 介绍Flask程序的部署流程:测试、性能优化、部署上线;介绍Flask开发的进阶话题:Flask扩展开发和Flask源码与机制分析。
 
  • 第12章:介绍Flask程序的自动化测试,包括单元测试和UI测试的编写、计算测试覆盖率和代码质量检查。
  • 第13章:对Flask程序进行性能优化的主要措施,包括函数与数据库查询的性能分析、缓存的使用(Flask-Caching)、静态文件优化(Flask-Assets)。
  • 第14章:介绍部署Flask程序前的准备,以及部署到Linux服务器和云平台Heroku、PythonAnywhere的完整流程。
  • 第15章:通过扩展Flask-Share来介绍编写Flask扩展的完整流程,从创建项目到上传到PyPI。
  • 第16章:介绍了Flask的一些设计理念,包括底层WSGI的相关实现,并对各个主要功能点进行源码分析。