15 年 11 月 19 日,我打开了一个不常用的邮箱,看到了 2 天前编辑给我发的邮件,问我想不想写本 Python 相关的书。

那个时候正是我的黑暗期,一个专注写代码几年的人开始做一些管理工作,一方面要学习,要转换思想,一方面心情也不好,每天就是在处理各种杂事,别说是技术进步了,哪怕把事情考虑周全的时间都没有。每天 一个人当成 2 个人来用,操碎了各种心,很累。

对于我这种写代码的,甚至都不善于逗小孩笑的程序员,总想给女儿点不一样的礼物。希望我带给她一些精神上的帮助。看到邮件的一瞬间,我就想象女儿长大之后,对其他人说:喏,那是我爸写的书,给我做生日礼物...

就是这 2 个理由。我决定写这本书。

12 月 4 日,我提交的大纲顺利通过审核。

12 月 6 日, CODE 真的开源了 ,喜大普奔。我靠着情怀坚持做完了。CODE 那段时间上了 Github Trending,我很欣慰,虽然一切都太晚了。

接下来的 20 多天里面,我正忙着弄 CODE 开源的事情,只是在构思这本书都要有什么内容,并没有下笔。我天真的觉得同时可以把 2 件事做好,但是后来发现时间完全是不够的,所以我停止的 CODE 的进一步的迭代。其他的原因是豆瓣已经决定迁移到 Github 企业版,我一个人并无力改变什么,如果公司自己都不用,那开源的就没有意义了。再则我也受到了厂内很多质疑和嘲讽,心碎。

一些写书的介绍可以看这篇专栏《 写一本技术书籍 》,并建议大家关注这个专栏,近期将有一大波文章要在专栏发呢。

专栏有些结论先发出来:

  1. 开始写书是在圣诞节左右,结束时间是 8 月 15 日。也就是差不多 240 天。
  2. 写这本书能让我挣 2W 多,嗯,时薪 23 块钱。

现在开始介绍这本书。

谁应该看本书

看书名可知这是一本 Web 开发相关的书,但事实上里面有大概一半的内容其实是 Python 工程师都能用到的。我对书的受众的理解是:

  1. Web 开发者
  2. 运维开发
  3. 想提高 Python 技能的开发者
  4. 其他想了解 Python Web 开发的其他开发者

需要注意,阅读本书需要有一定的 Python 基础,因为书中没有基础语法教程,如果你之前没用 Python 写过程序阅读起来可能会受到影响。

为什么值得看

我阅读过大量和 Python 有关的纸质书和开源图书,渐渐学到了很多控制自己 “剁手” 买书的方法。我来分析一下为什么你值得拥有本书。:)

为什么要买书来看?我认为不外乎两个原因:有趣和能学到东西。技术书肯定不会太有趣,那么最重要的就是能学到东西。市面上 Python 相关的书相当多,但是有些内容陈旧或者不符合国情,经常能看到并非开发第一线的人写或者翻译的书,这些书显然价值就要低一些;其次是同质化和向入门级别靠拢,我个人认为市面上关于 Python 入门或者教授语法知识的书不少,而再深入一点的就很匮乏了。

本书有几个特点: 第一,使用了当前主流和前瞻性的技术,如 Docker、Ubuntu 16.04 LTS、Cython、CFFI、Py.test、asyncio、IPython 5.0 LTS 等,书中一部分内容是在 Python 3 下完成的。本书中全部工具都使用当前最新版,能保证在相当长的时间内书中的内容都不会过时。 第二,笔者在国内应用 Python 最大的豆瓣网做产品开发,一直在第一线写代码,大量例子和经验都是根据实际经验出发的。 第三,笔者非常关注 Github 和 Python 社区,会第一时间了解到新的趋势和思想,并在书中体现。举个例子,代码检查工具 pep8 已经在 Guido van Rossum 的要求下改名为 pycodestyle 了。

叔本华在《人生的智慧》中说过一段话,大意是人要么庸俗,要么孤独。笔者认为这个道理在阅读上面也成立:读什么样的书,就会逐渐成为什么样的人。本书提供了很多笔者在其他书中没有看到过的思考方式和 Python 的用法,这也是本书存在的意义。

本书涵盖的内容

第一章.「初识 Python Web 开发」

将回答 Python 工程师关心的如下 3 个问题:

  1. 为什么应该选择 Python 作为 Web 开发语言?
  2. 在 Python 2 和 Python 3 之间如何选择?
  3. 在这么多的 Python Web 框架中哪些是主流的,它们的特点是什么,该如何选择?

第二章. 「Web 开发前的准备」

  1. 环境的准备,以便读者能够使用 Vagrant 或者 Docker 提供的 Ubuntu 环境运行书中的例子。
  2. 介绍包管理工具 pip 及一些高级用法。
  3. 实现 PYPI 的缓存代理和完全镜像。
  4. 使用 virtualenv 及其扩展实现虚拟环境管理。

第三章. 「Flask Web 开发」

  1. 通过多个应用例子了解 Flask 框架使用的一些精髓。
  2. 介绍目前最流行的模板引擎 Jinja2 和 Mako 的使用,以及实践总结和做选择时的建议。
  3. 通过一些例子让读者熟悉 MySQLdb 的使用,并演示如何和 Flask 应用集成。
  4. 通过源码帮助读者理解 Flask 的上下文设计,并演示大型应用中使用上下文钩子的例子。
  5. 通过一个真实的案例学以致用。先分析需求,接着从零开始实现一个文件托管应用。

第四章. 「Flask 开发进阶」

  1. Flask 的信号机制。利用信号可以实现一部分的业务解耦。
  2. Flask 的一些常用、主流的扩展,如 Flask-Script、Flask-DebugToolbar、Flask-Migrate、Flask-WTF、Flask-Security、Flask-RESTful、Flask-Admin 和 Flask-Assets。每个扩展都包含至少一个完整的真实例子。
  3. Flask 的依赖库 Werkzeug 的使用。

第五章. 「REST 和 Ajax」

  1. 帮助读者理解 REST。
  2. 学习如何设计一个合理、好用、符合标准的 API。
  3. 使用 jQuery 和 fetch 分别完成一个前后端交互的 Ajax 应用。

第六章. 「网站架构」

  1. 了解 WSGI 协议。
  2. 主流的 Python 应用服务器的特点和使用方法。
  3. 使用 Nginx 和 Python 应用服务器部署 Flask 应用。
  4. 介绍豆瓣开源的 Libmc 和豆瓣常用的缓存使用方式。
  5. 举例说明 Redis 的几个应用场景,包含使用 MessagePack 进行序列化和反序列化工作。
  6. 介绍使用 NoSQL 的原因和场景。
  7. 使用 pymongo,并用 Mongoengine 重构文件托管服务的模型。
  8. MongoDB 索引、高可用和分片的经验。
  9. 以豆瓣的基础架构为原型,展示主流大型网站的架构模式,并详细介绍相关重要模式,以及 Web 前端的性能优化经验。

第七章. 「系统管理」

  1. 使用 Supervisor 管理进程。
  2. 使用 Fabric 进行应用部署。
  3. 通过部署 Redis 了解配置管理工具 SaltStack 和 Ansible。
  4. 使用 Psutil 获取系统 CPU、内存、硬盘和网络等信息。
  5. 配图演示 Sentry 的安装和收集错误信息的效果。
  6. 使用 StatsD、Graphite、Diamond 和 Grafana 搭建 Web 监控,并介绍常见的运维监控工具及其主要应用场景。

第八章. 「测试和持续集成」

  1. 介绍和使用 Python 内置测试模块 unittest 和 doctest。
  2. 介绍和使用第三方测试工具 py.test 和 mock。
  3. 深入持续集成,并通过 Buildbot 实际地对一个 Github 项目进行集成。

第九章. 「消息队列和 Celery」

  1. 使用 Beanstalkd。
  2. 解释 AMQP,深入理解 RabbitMQ,介绍 RabbitMQ 插件系统,RabbitMQ 集群的故障转移方法等。
  3. 介绍 Celery 的架构,运行起一个真实的应用,在 Flask 应用中使用 Celery 等功能。
  4. 深入 Celery,介绍 Celery 的依赖及独立用法、Worker 管理、监控等高级功能。
  5. 笔者总结的一些 Celery 实践经验。

第十章. 「服务化」

  1. 为什么需要服务化。
  2. 使用 Thrift 对文件托管服务改造。
  3. 介绍豆瓣服务化实践 ——PIDL 的起因、基本原理和基本架构。

第十一章. 「数据处理」

  1. 使用纯 Python 代码实现 MapReduce 功能。
  2. 配置 DPark 环境,深入了解 DPark,演示如何用 DPark 对业务日志进行 PV 和 UV 的分析。
  3. 通过发送带有样式和附件的邮件,创建包含带样式和 Sparkline 图表的 xlsx 文件,以及创建包含多工作表和 4. 图表的 xlsx 文件这三个有用的例子,展示笔者对数据报表的理解和运用。
  4. 基于数据报表中的数据,用 Pandas 进行分析和展示。

第十二章. 「帮助工具」

  1. 解释为什么应该使用 IPython,配置 IPython、调试复杂代码、并行计算等。
  2. 介绍 Jupyter Notebook 的用途,配置 Jupyter Notebook,在 Notebook 里使用 Echarts 自定义 JavaScript 和 CSS 样式等高级功能。
  3. 介绍常用的获得 Linux 服务器相关情况的工具。
  4. 介绍性能测试工具 Boom 和 tcpcopy,并演示如何搭建一个 tcpcopy 环境。
  5. 介绍分析 Python 程序性能瓶颈的工具。
  6. 演示如何定制基于 IPython 的交互解释环境。
  7. 演示豆瓣东西在 2014 年双十一进行的 Jupyter Notebook 实践。

第十三章. 「Python 并发编程」

使用多线程、多进程、Gevent、Future 和 asyncio 这五种方式实现一个爬取微信公众号的抓取。其中还揭秘了一些写爬虫的经验。尤其是告诉读者如何选择并发方式。

第十四章. 「Python 进阶」

  1. 介绍 errno、subprocess、contextlib、glob、operator、functools、collections 模块的使用方法。
  2. 笔者对《Python 之禅》的理解。
  3. 笔者总结的一些 Python 实践经验,并列举了两篇最佳实践的文章。
  4. 介绍一些 Python 3 的有用功能,并移植到 Python 2。
  5. 通过真实的例子演示如何使用 CFFI/Cython 编写 Python 扩展,并对比二者的执行效率。
  6. 演示使用 PyObjC 发送通知的例子,让开发者收到的通知更有针对性。

第十五章. 「Web 开发项目实践」

  1. 介绍笔者的 Web 项目开发流程和经验。
  2. 介绍开源的代码质量保证工具,以及豆瓣的一些质量保证实践。
  3. 使用 AST 对真实的业务逻辑做静态检查,实现业务流程的检查。
  4. 谈谈代码评审的意义和实际经验。

PS: 本书还有其他惊喜,我就不打广告了。感谢大家支持,也希望通过本书能让你有所收获。