新書推薦:
《
失衡与重塑——百年变局下的中国与世界经济
》
售價:HK$
135.7
《
不被定义的年龄:积极年龄观让我们更快乐、健康、长寿
》
售價:HK$
79.4
《
南方谈话:邓小平在1992
》
售價:HK$
82.8
《
纷纭万端 : 近代中国的思想与社会
》
售價:HK$
109.8
《
中国古代文体形态研究(第四版)(中华当代学术著作辑要)
》
售價:HK$
172.5
《
朋党之争与北宋政治·大学问
》
售價:HK$
102.4
《
甲骨文丛书·波斯的中古时代(1040-1797年)
》
售價:HK$
90.9
《
以爱为名的支配
》
售價:HK$
64.4
|
編輯推薦: |
Python Web开发的百科全书,了解Web工程从开发到上线的完整流程
对实际Web项目中大量实战经验的总结,有用、实用
|
內容簡介: |
本书按照一个Web 产品从无到有、从简单变复杂、从基础到进阶的过程,多角度、全方位讲述了Python Web开发。内容涉及Web框架、测试、数据库、消息队列、服务化、持续集成等,把网站工程的全貌展现在读者的眼前,从其中可以了解Web工程从开发到上线的完整流程。另外,作者对当前现在正在流行的技术或工具,如Flask、Celery、Jupyter、Supervisor、SaltStack、Pandas等都有较为详细的阐述,可作为技术选型时的参考。对于Web 开发者、使用Python 语言的运维工程师和运维开发工程师、想提高Python 技能的开发者、想了解Python Web 开发的其他开发者,本书都适合阅读。
|
關於作者: |
董伟明,豆瓣高级产品开发工程师,主要负责豆瓣读书、电影、音乐、东西等产品线。从2011年开始接触Python, 从运维、运维开发到现在的Web开发,积累了丰富的运维和开发经验,他积极参与开源项目,给IPython、pip及Python标准库等贡献过代码。这本书是他这些年使用Python进行Web开发,对各方面知识理解和积累经验的梳理和总结。个人博客是http:www.dongwm.com,GitHub地址为https:github.comdongweiming
|
目錄:
|
第1 章初识Python Web 开发. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Python Web 开发介绍
为什么应该选择Python 作为Web 开发语言
选择Python
还是Python
Web 框架介绍
主流Web 框架
小众的Web 框架
选择Web 框架时应遵循的原则
第2 章Web 开发前的准备. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
搭建一个能运行的虚拟机环境
安装VirtualBox
使用Vagrant 安装
使用Docker 安装
包管理和虚拟环境
包管理
使用pip 替代easy_install
distribute、distutils 和setuptools
entry_points
插件系统
虚拟环境
virtualenv
virtualenv 定制化
virtualenvwrapper
virtualenv-burrito
autoenv
进阶篇:pip 高级用法
命令自动补全
普通用户安装
编辑模式
使用devapi 作为缓存代理服务器
PYPI 的完全镜像
第3 章Flask Web 开发. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Flask 入门
安装Flask
从Hello World 开始
配置管理
调试模式
动态URL 规则
自定义URL 转换器
HTTP 方法
唯一URL
构造URL
跳转和重定向
响应
静态文件管理
即插视图
蓝图
子域名
命令行接口
模板
Jinja2
Mako
使用MySQL
安装MySQL 和驱动
设置应用账号和权限
用MySQLdb 写原生语句
事务提交和回滚
ORM 简介
使用SQLAlchemy
使用ORM
数据库关联
在Flask 中使用SQLAlchemy
记录慢查询
理解Context
本地线程
Werkzeug 的Local
flask.request
使用上下文
使用LocalProxy 替代g
从零开始实现一个文件托管服务
首页
重新设置图片页
下载页
预览页
短链接页
第4 章Flask 开发进阶. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Flask 的信号机制
Blinker 的使用
Flask 中内置的信号
自定义信号
信号订阅的高级用法
Flask-Login 中的信号
Flask 的扩展
Flask-Script
Flask-DebugToolbar
Flask-Migrate
Flask-WTF
Flask-Security
Flask-RESTful
Flask-Admin
Flask-Assets
Werkzeug 的使用
DebuggedApplication
数据结构
功能函数
密码加密
中间件
第5 章REST 和Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
什么是REST
RESTful API 设计指南
使用名词来表示资源
关注请求头
合理使用请求方法和状态码
正确地使用REST
对输出的结果不再包装
不要做出错误的提示
使用嵌套对象序列化
版本
URI 失效和迁移
信息过滤
速度限制
缓存
并发控制
使用Ajax
第6 章网站架构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Python 应用服务器
WSGI 协议
常见的WSGI 容器
Web 服务器Nginx
Web 服务器与应用服务器的区别
为什么要选择Nginx
安装Nginx
使用Nginx 部署Flask 应用
缓存系统Memcached
Libmc 安装配置
使用原生SQL 缓存
缓存更新策略
Memcached 使用的经验
键值对数据库Redis
操作Redis
Redis 应用场景
分片和集群管理
NoSQL 数据库MongoDB
为什么使用NoSQL
MongoDB
使用pymongo 的例子
使用Mongoengine 的例子
MongoDB 实践经验
大型网站架构经验
缓存
负载均衡
高可用
业务拆分
集群
第7 章系统管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
进程管理Supervisor
Supervisor 组件
配置Supervisor
使用Supervisor
应用部署Fabric
Fabric 应用接口
使用Fabric 管理Flask 应用
配置管理工具SaltStack 和Ansible
SaltStack
Ansible
使用Psutil
使用Sentry 收集错误信息
安装配置Sentry
启动Sentry
创建团队和项目
配置SDK
使用StatsD、Graphite 等搭建Web 监控
配置Graphite
使用StatsD
配置Diamond
发布指标项
使用Grafana
使用Kenshin
第8 章测试和持续集成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
使用unittest 和doctest 做测试
unittest
doctest
使用py.test 和mock
py.test
mock
持续集成
使用Tox 集成
第9 章消息队列和Celery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
使用Beanstalkd
使用Beanstalkc
深入理解RabbitMQ
AMQP
虚拟主机
插件系统
通过Web 和REST API 管理RabbitMQ 259
故障转移
使用Celery
Celery 的架构
Celery 序列化
安装配置Celery
从一个简单的例子开始
指定队列
使用任务调度
任务绑定、记录日志和重试
在Flask 应用中使用Celery
深入理解Celery
Celery 的依赖
任务调用
信号系统
Worker 管理
监控和管理Celery
子任务
进阶篇:Celery 最佳实践
使用自动扩展
善用远程Debug
合理安排任务周期
合理使用队列和优先级
保证业务逻辑的事务性
关闭你不想要的功能
使用阅后即焚模式
善用Prefetch 模式
善用工作流
第10 章服务化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
为什么需要服务化
RPC 框架
服务化带来的问题
微服务架构
使用ri
定义IDL 文件
服务端实现
客户端实现
PIDL——豆瓣的服务化实践
PIDL 架构
第11 章数据处理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
使用MapReduce 做日志分析
使用MapReduce
使用DPark
分布式文件系统MooseFS
Mesos
配置DPark 环境
从WordCount 开始
PV & UV 统计
数据报表
发送带有样式和附件的邮件
创建xlsx 文件
使用Pandas
Pandas 入门
读取MySQL 数据库
和Flask 应用集成
第12 章帮助工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
IPython
IPython 交互模式
常用的Magic 函数
配置和自定义IPython
IPython 的扩展系统
使用IPython 调试复杂代码
双进程模型
并行计算
Jupyter Notebook
Notebook 格式
Notebook 格式转换和预览
为什么使用RequireJS
在Notebook 里使用Echarts
富显示
自定义JavaScript 和CSS 样式
使用nbextension 扩展Notebook
在Notebook 上使用并行计算
调试和Debug 工具
了解Linux 服务器运行情况
性能测试
Python 程序性能分析
性能调优实践
进阶篇:定制基于IPython 的交互解释环境
进阶篇:豆瓣东西的Jupyter Notebook 实践
第13 章Python 并发编程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
使用多线程
使用Gevent
使用多进程
使用Future
使用asyncio
asyncawait
Future
使用aiohttp
使用队列
第14 章Python 进阶. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
使用标准库模块
errno
subprocess
contextlib
glob
operator
functools
collections
Python 语法最佳实践
命名
使用join 连接字符串
EAFP vs LBYL
定义类的__str____repr__ 方法
优美的Python
从Python 3 移植
partialmethod
singledispatch
suppress
redirect_stdoutredirect_stderr
使用CFFICython 编写Python 扩展
使用CFFI
使用Cython
进阶篇:使用PyObjC 发送通知
第15 章Web 开发项目实践. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Web 项目经验总结
开发流程
使用合理的项目结构
关注代码复杂度
代码质量保证工具
Pycodestyle 对中文缩进的处理
Flake8
Pylint
其他代码质量保证工具
使用AST 做静态检查
其他静态检查工具
编写Flake8 扩展
代码评审的意义
作为被评审者
作为评审者
评审的标准
|
內容試閱:
|
为什么写这本书
2011 年,我还在一家互联网商务公司做一枚小小的运维工程师,那时公司的运维使用的语言主要是Shell。我本来是一个网络运维,后来在工作中开始接触Shell,学了2 个月之后,感觉可以应付各种需求,虽然程序运行得很慢,但作为一个工作不久且不是IT 相关专业毕业的运维人员,我还是有点沾沾自喜。这种情况只持续了2 个多月,由于公司高速发展,一个新入职的同事打破了我的美梦。
这位新同事入职的第一件工作就是对接各个业务部门的日志需求。很快就发生了一件让我特别震撼的事情:同样的一个日志需求,我使尽浑身解数用20 行Shell 写好,运行一次要20分钟,而这位同事使用Perl 语言的脚本只用了4 行,运行3 分钟就完成了。可以想象我当时的感受。这是我第一次了解到选择正确的工具和方法的重要性。我抑制不住地告诉当时的领导悦秋:我要学一门运维使用的高级语言!
悦秋特别郑重地告诉我:一定要学Python。而在2011 年,Python 还只是一门小众语言,在BAT 等大公司招聘时仅作为一些职位的附属要求。回想至此,非常感谢悦秋让我选择了正确的路,否则我现在可能只能写关于Perl 语言实践方面的书了。
从运维到运维开发,再到豆瓣做产品开发(也就是Web 开发),一路走来我发现,自己走了很多弯路,没有人告诉我什么是对的,什么是错的,该怎么做选择。这些都得自己花时间去琢磨和验证,有时候从Google、StackOverflow 搜索答案,或者在GitHub 直接看源码获得灵感甚至正确答案,而涉及职业规划、该学什么、怎么学,这样的问题除了悟性大部分就是靠直觉了。
从买书看基本语法和拷贝别人的代码开始学习Python,很早我就开始努力让代码符合PEP8,尽量让代码写得Pythonic(这点很关键,未来就不再需要费力改正学习过程中留下的坏习惯了)。能用Python 完成日常工作之后,我开始研究和寻找各种Python 高级玩法、黑魔法。这个时候我还是在不断买书、看书、看之前买的书、看一些技术博客来巩固和补充自己的知识体系。所谓技术中的术也就到这里了。
有了术还远远不够,还需要有实际的经验,以及在正确的时机使用正确的工具和方法,这是技。技是一套分析并解决问题的思路,要想提高技,除了个人的领悟,最重要的是靠大量的实践,有时候我们称之为造轮子。关键是在造的过程中得思考,比如什么时候该抽象了?这个轮子和竞品相比有什么优势?技术选型上为什么要使用XX?
使用Python 会遇到这样的问题:什么时候该用多进程?怎样提高代码执行效率?Flask 为什么流行?曾经遇到一个冷门的Celery 的Bug,当时使用谷歌没有找到解决方案,甚至解决的思路也没有,怎么办?我开始翻阅PEP 文档,阅读优秀开源项目的源码,还把Python 标准库模块中的代码全部过了一遍,收获颇丰。同时我还会根据工作中遇到的问题,给开源项目和Python 提一些Issue,后来还给它们提交Patch,用自己微薄的能力,让社区变得好一点点。
虽然过了而立之年,我还在不间断地更新博客(dongwm.com),希望给其他开发者带来帮助和灵感。当许艳编辑找到我时,双方一聊,发现对国内开发者而言实战类Python Web 开发方面的书确实不多,我顿时觉得可以以自己多年的工作经验积累写一本,为女儿两岁生日送上一份不一样的礼物。作为一个做过运维,现在做后端,却经常写前端程序的人来说,我了解产品的整个过程,是适合写一本这样的书的。写这本书的意义还在于,将自己这几年在使用Python 进行Web 开发中对各方面知识的理解和积累的经验进行梳理和总结,让更多人受益,同时对自己也是一种成长,也算是对国内的Python 环境做出个人的贡献了。
谁应该看本书
虽然语言只是工具,但是阅读本书还是需要有一定的Python 基础,如果你还没学过Python,那就先学习一段时间再来阅读本书,收获会更多。
本书主要面向如下4 类人群:
Web 开发者。
使用Python 语言的运维工程师和运维开发工程师。
想提高Python 技能的开发者。
想了解Python Web 开发的其他开发者。
为什么值得看
本人阅读过大量和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 的用法,这也是本书存在的意义。
本书的特别用法
本书中有些效果可能会让读者迷惑,在这里解释一下。
1. 交互模式下的效果。本书在交互模式下完成的例子都使用了IPython,效果如下:
In : template.rendername=''Xiao Ming''
Out: u''Hello Xiao Ming!''
其中In : 是输入,Out: 是输出。
2. 终端提示符。本书绝大多数的终端提示符没有使用# 或者$,而使用了?。
本书的组织方式和阅读建议
笔者和身边的一些朋友交流过,大多数人买书来看,基本上都是看到书中讲到了自己一直不太懂的知识点,或者感兴趣的话题。因此,在写作本书时,笔者有意让每章相对独立。你可以选择跳着看,当然更推荐从第1 章一直看到最后一章,因为本书是按照一个Web 产品从无到有、从简单变复杂、从基础到进阶的过程编排的。
我们先来大致了解一下这个过程。
第1 章首先回答两个问题:为什么应该选择Python 作为Web 开发语言和选择Python 2 还是Python 3,然后介绍Python 主流的Web 框架,并为如何选择给出建议。
第2 章帮助读者跑起来一个包含本书所讲内容的Ubuntu 环境,读者可以直接在里面运行书中的例子。限于篇幅,如果想要了解环境搭建的整个过程以及笔者做这些选择的理由,可以在本书源代码项目中的setup.md 文件中获取,短链接地址为http:bit.ly29N4Pqv。接着将展开介绍Python 的包管理和虚拟环境相关的内容。通过学习这章,读者对Python 生态环境会有一定了解。
第3 章先从最简单的Flask 例子开始,学习一些Flask 相关的知识,接着学习Jinja2和Mako 模板(Mako 在豆瓣的使用非常广泛),使用MySQL,最后学以致用,从零开始完成一个相对复杂、在豆瓣有类似功能的文件托管服务。这个项目贯穿本书,在之后的章节中会对它继续扩展。
第4 章这一章是Flask 的进阶,包含了大量的Flask 扩展的使用,还介绍了信号机制和Werkzeug 的使用。到这里读者对Flask 和Web 开发已经入门,可以根据自己的想法自己做一些应用了。
第5 章现在Web 端应用对交互的要求很高,移动应用对后端的API 需求也非常多,需要很好的异构通信方式,本章将介绍笔者对REST 的理解,并提出一些设计API 的注意事项,最后通过jQuery 和fetch 实现使用Ajax 的例子,让读者了解如何让前后端通信。
第6 章我们已经有了有实际业务逻辑的Web 应用,可是用户还不能访问,本章将介绍如何选择应用服务器,用主流的方式在生产环境中运行这个应用。之前应用中只是使用了MySQL,在实际的网站应用中,缓存、键值对数据库、NoSQL 数据库都是主流的解决方案,本章将一一介绍为什么要用这种技术以及怎么用。最后作为总结,笔者根据自己的实际经验绘制一张大型网站的架构图,并详细介绍其中模式选择的理由和经验。
第7 章在第6 章,Web 应用已经运行起来,用户也可以访问了。但是如下问题也随之出现:
◇ 应用依赖多个服务,如MySQL、Redis 等,这些服务器在新环境中的部署是有顺序要求的,而且程序要保证一直在运行状态。
◇ 上线过程不能自动化。每次上线都要手动执行很多命令,既耗时又容易出错。
◇ 希望能及时了解和分析服务器和应用的运行状态。
看完本章相信你就可以知道对应的解决方案了。
第8 章Web 应用运行良好,可是应用的质量还没有保证,如何在上线之前发现更多的Bug 的需求变得越来越迫切。本章将介绍主流的测试方法,并用一个GitHub 项目实现持续集成。
第9 章前面介绍的是Web 应用必备的内容,从本章开始介绍一些进阶的内容。消息队列能带来更好的用户体验,本章将介绍豆瓣用到的消息队列工具Beanstalkd,以及Celery 推荐的消息队列RabbitMQ。如果Web 产品有大量的定时任务或者其他异步任务,就可以使用Python 界最知名的Celery 解决,本书将从浅入深让读者熟悉Celery 原理和使用方法,最后分享笔者使用的进阶实践。
第10 章现在各个大公司都在谈服务化,通过这几年的改造和实践,大家都有自己的一套服务化方案,豆瓣也不例外。本章将告诉读者为什么要服务化、豆瓣的服务化设计,以及使用开源的ri 改造文件托管服务。
第11 章笔者在工作中经常要给各个业务方提供数据支持,如日志统计分析、数据报表。本章将演示如何使用纯Python 代码在单个服务器上利用多核实现MapReduce功能,还详细讲解豆瓣工程师都在用的DPark,包含安装、环境配置、使用和框架化分析UV & PV;接着将展示几个笔者在实际工作中遇到过的数据报表需求,并讲解如何用Pandas 做数据可视化。
第12 章这一章将详细介绍IPython 和Jupyter Notebook 这两个工具,并分享其在豆瓣对应的实践。除此之外,还列出笔者日常用来排错和调试的工具,包括了解Linux服务器的相关情况、性能测试、分析Python 程序性能瓶颈三个方面。
第13 章Web 开发日常也会有一些并发编程工作,所以本章以抓取微信公众号文章为主线,分别使用多线程、多进程、Gevent、Future 和asyncio 这5 种编程方式完成不同阶段的爬取任务,也深入地分析在它们之间如何选择。
第14 章Python 进阶并不只针对Web 开发人员,对于所有Python 开发者都有意义。
前言xvii
本章介绍了一些非常有用的标准库模块,也有笔者对《Python 之禅》的理解和总结的一些语法实践,还讲述了从Python 3 移植一些有用的功能及编写Python 扩展等内容。
第15 章介绍笔者日常进行Web 开发的流程和经验,还着重介绍了多个代码质量保证工具,以及豆瓣的一些质量保证实践。最后一节,笔者将谈谈代码评审的意义和实际经验。
需要说明的是,章与章以及每章内的节与节之间没有明确的递进关系,不同产品形态让Web 产品在其发展的不同阶段对技术的选择和侧重点都有所不同。举个例子,并不是前8章讲到的内容在产品中都用到了,才能在应用中引入消息队列和Celery,要根据实际情况灵活选择。在产品发展还没有遇到瓶颈之前就要考虑和尝试引入对应的解决方案,确保不会影响产品高速发展。
使用代码示例
书中的完整例子的代码都存放在GitHub 上(https:github.comdongweimingweb_develop),可以在GitHub 上查看和下载。本书提供的Vagrant 和Docker 环境已经包含了这个项目,但可能并不是最新的代码,如果遇到运行失败等问题,可以在项目的Issue 页面先搜索是否之前有人遇到过同样问题。如果没有找到,请尝试保存本地修改后使用如下命令同步最新的代码,然后再运行:
git pull --rebase origin master
例子文件的名字在书的对应位置会提到,文件存放在对应的章节的子目录下,比如第3 章第1 节的例子,就会放在chapter3section1 目录下。有一些文件是相对于项目根目录的,比如静态文件统一存放在static 目录下,模板文件统一存放在templates 目录下。绝大多数模板文件使用相同的对应章节的约定,比如第4 章第2 节的模板存放在templateschapter4section2目录下。
反馈和勘误
由于笔者水平有限,加之本书的编写稍显仓促,书中难免出现一些不准确甚至错误的理解和不能运行于所有环境的例子,恳请读者批评指正。如果你在阅读过程中有任何问题或者发现任何错误,都可以去本书源代码的Issue 页面来提问,或者发送邮件到ciici123@gmail.com,我会尽量一一解答。
本书的全部勘误将放在项目的errata.md 文件中,地址是http:bit.ly2a9ep8V,在提交错误之前请先看看是不是之前有人已经提过了。
为了促进本书读者的交流和反馈,笔者创建了一个关于Python 和Web 开发等主题的社区,地址是http:python-cn.org,关于本书的意见和建议也可以到这里反馈。这个平台也能帮助你认识更多阅读本书、对Python 和Web 开发有兴趣和有经验的人。
致谢
首先感谢给本书做技术评审的洪强宁(hongqn)、大妈(Zoom.Quiet)、清风、李迎辉(limodou)、邢犇(CNBorn)、胡阳(the5fire)、姚钢强(acmerfight)、蔡斌(VeryCB)和Spawnris。你们从技术和全书规划等角度提出了很多有用的意见和建议,让我受益匪浅。尤其特别感谢Zoom.Quiet,提供了大量建设性的批评意见,这些意见深刻而透彻,对笔者改进和重构内容帮助极大,尤其是对第3 章和第5 章。接下来,感谢写书过程中豆瓣同事对我的帮助:感谢Guillaume Bouriez 对PIDL 部分的审阅,他以法国人的严谨提出了很多有用的建议;感谢潘妙才让豆瓣的缓存服务运行良好,产出了非常好的使用缓存的文档,并对我提出的缓存问题耐心回答;感谢田忠博对我搭建DPark 提供了很大的帮助,对DPark 的特点的总结源于田老师的内部分享幻灯片。
感谢电子工业出版社的编辑许艳和其他同事,本书能在8 个月的时间出版,离不开你们的敬业精神和一丝不苟的工作态度。
最后,最应该感谢的是我的父母、妻子和女儿,你们是我生命中最重要的人。尤其感谢我的妻子,在我占用大量周末、晚上的时间进行写作的时候,能够给予极大的宽容、支持和理解,对我和女儿悉心照顾并承担了全部的家务,让我能够全身心投入到写作中。
Amy,你是我写作本书最大的动力,这是爸爸送给你2 周岁的特殊礼物。
2016 年8 月7 日
推荐序一
作为一名使用Python 作为主力开发语言十多年的老码农,常常被人要求推荐Python 相关的图书。经常推荐的都是一些讲解Python 语言本身的图书,而专注在Python 的常见应用领域 Web 开发上的好书,却一直是凤毛麟角。也曾有出版社的朋友约我写一本,但我畏惧写书的艰辛,一直不敢答应。得知伟明的《Python Web 开发实战》一书即将出版,欣慰异常,心想伟明写这个专题实在是再合适不过,必为佳作。读完书稿,果不其然。
由于Python 具有开发快速、适合多人协作、库丰富、社区成熟等优点,因此是一门非常适合用于Web 开发的语言。国外的Youtube、Quora ,国内的豆瓣、知乎等,均是以Python 为主要语言开发的。说起Python 的Web 开发,很多人会理解成只要学会某个Web 框架,能写代码查查数据库,写模板渲染出HTML ,最多再学一下配个Web Server 把服务启动起来就行,没什么内容。多数Python 书里Web 开发的章节一般也就是讲这些。但其实要完成生产可用的,能够应对一定规模访问量的Web 系统,Web 开发工程师要学会的远远不止这些。环境搭建、API 设计、网站架构、系统管理、持续集成、服务化、数据处理、并发处理等,这些都是必要的,而且需要付出大量的努力才能掌握的知识。
伟明一直对技术抱有极强的兴趣,也有着优秀的动手能力。我对他的第一印象是从他发给豆瓣的求职信开始的:目前我给glances、Salt、tmux-powerline、supervisor、mongo-pythondriver、circus、graphite-web、Diamond、autopep8、graph-explorer、pip、Celery 等开源项目贡献过代码,给Python 标准库logging 贡献过代码。能够参与到这么多一线开源软件中的应聘者,确实少见。入职豆瓣后,伟明也表现出了对Web 开发的深刻理解,很快成为豆瓣多个Web 产品的主力,并几乎凭一人之力完成了CODE 项目的私有依赖剥离和开源。
伟明把他个人多年Web 开发的经验,以及豆瓣十年来数百名优秀工程师在Web 开发上最佳实践的积累,凝聚在了《Python Web 开发实战》这本书里,多维度、全面地介绍了PythonWeb 开发涉及的各种技术。更难能可贵的是,他还在这本书里留下了非常多关于这些技术的思索:为什么要使用某个技术?某个需求都有哪些技术可以满足?如何取舍?这种不仅要知其然,还要知其所以然的态度,是工程师快速成长必备的。
这样的一本书能够出版,对于国内的Python 开发者绝对是个福音。我向所有有兴趣使用Python 做Web 开发的开发者们,强烈推荐此书。
洪强宁
爱因互动CTO
前豆瓣首席架构师
前宜信大数据创新中心首席架构师
推荐序二
这篇序酝酿了好几天,今天终于动笔写下了第一个字。说实话,很久没有看到关于Python的好书了,尤其是国人自己的原创书。Web 开发本身就是一件很庞杂的事情,模板渲染、API 的开发、后端的部署,能在一本书中把这些问题都说清楚并不容易。作者伟明与我都出身豆瓣,虽然没有同时期在豆瓣工作过,但豆瓣的CODE 系统把我们俩联系到了一起。他是CODE 的三代目,通过CODE 里一行行Python 代码,仿佛知道了彼此的心意。感谢伟明把豆瓣的一些工程实践进行了整理和总结,这是本书最宝贵的一点。而本书的精华在于他对各种技术使用场景的探讨:那些库谁都会用,但在什么场景使用,在生产环境中这个库的表现到底如何,则不见得有认真的思考。期望将来还可以看到越来越多这样的图书,祝此书大卖。
清风
SAY CEO
前豆瓣技术总监
推荐序三
一次真诚的倾诉
自从CPyUG 列表订阅人数超过10,000 以后,我就认为中文的Python 学习资料足够多了,而最正确的自学姿势应该从官方文档开始。但是,《Python Web 开发实战》一书又改变了我这一偏见。
有道是:出版是最好的记忆,伟明亲身证实了这一点。作为一名普通的程序员,只从一个念头出发,独自写出了500 多页的技术图书,这实在是一件令人敬佩的事。凡是写过书,特别是写过技术图书的人都知道写书,难的不是写什么,如何写,而是要耐得住寂寞!在中国生活原本就如此艰辛,无论上学还是工作,周围永远有无数同侪在竞争;而写书几乎是负收入的经济行为,特别是技术图书。当然,图书印刷出来,奉上对家人的感谢,是一种别样的程序员式的浪漫情怀,这种成就感不足为外人道矣。
伟明打动我,让我为他写推荐序,就在于他说自己写书的那个简单的初衷:让公司所有人都知道Web 开发究竟是什么样的,从而能更好地协同。这其实已经是佛陀流传经文普度众生的大情怀了!
Python 是如此活跃的一种语言,几乎伴随互联网的发生而创立,又伴随互联网的极速发展而繁荣,在Web 开发领域拥有全栈式的技术生态;又因为脚本语言以及其自身语言的人性化设计,通过Web 勾联到了几乎所有计算机应用领域,这也导致在特定问题上,Python 总是有一堆解决方案可以选择,而不像其他语言,只有一种方案。但是选择过多,其实也导致了学习成本的增加。
伟明将自身在Web 领域所有方面的经验提炼后整理成书,本质上是将几十个关联产品的官方文档,结合具体工程经验进行了梳理,给出了领域问题最佳方案的关键思考点和自己的答案,而更加可贵的是,给出了这些思考点的来源,以及形成过程,即给出了解决各种Web领域问题的思维模式。
从前后几个版本的书稿也可以看出,如果没有这本图书的艰苦整理,伟明自己也难以形成这种宏观微观能同时作用的思考模式。所以,我一直认为:输出是更加残酷的输入。要将纷繁零散的经验,变成他人可以习得的技能,要组织成叙述合理、案例得当、结构清晰的图书,这个过程本身就得对自己的所有积累进行反复的再学习、解析和增补。其中的工作量远远不止这几百页书的内容。
更加奇妙的是,在没有这部书稿前,其实我们并不熟悉,只是在社区列表中见过邮箱名而已。但是,有了独有的知识成果后,伟明就有了立场,也有了动机和理由,邀请我以及类似洪教授Limodou 这些中国Python 学习者的前辈来评点和审核书稿,获得直接的联系,即人脉。
所以,我在郑重推荐此书的内容之外,更加倡议大家向伟明学习敢于写书,通过真诚的技术图书总结自己的过去,获得更好的未来,帮助更多的Pythonista。
Zoom.Quiet(大妈)
优视眼动科技CTO
Python 中文社区创始人之一及管理员
OBP 及蟒营工程设计者兼主持人
推荐序四
说起来给《Python Web 开发实战》一书写序还真是很突然。2016 年5 月30 日,我突然被拉到了一个微信群里,正觉得纳闷的时候,看到群里Zoom.Quiet 的介绍,才知道是怎么回事。原来《Python Web 开发实战》已经基本成书,让大家看一看。对于本书的作者董伟明,我们没有在线下交流过,但是对Python 的热爱时不时地会把大家通过某种方式吸引到一起。
这是一本原创图书,从书名来看是和Web 相关的,而Web 领域正好和我的兴趣以及平时的工作相关。作为一个开源Web 框架的开发者,自然对Web 开发的内容比较感兴趣,借由此书正好可以了解一下别人是如何理解以及如何实践Web 开发的,更何况作者还是豆瓣的工程师,因此对书的内容还是有一些期待。
经过一番阅读之后,我与伟明交流了一些看法,他给予了详细的解释与说明,我对他的写作思路也有了一些了解。对Web 开发的理解其实可以有很多角度,比如,从开发者的角度,这就会更多从具体的功能实现、框架使用来看待;从运维者的角度,会更多地从部署、维护、平台的角度来理解;从测试及质量的角度,会关心代码的测试性及代码审查;从框架开发者的角度,就要了解Web 开发涉及哪些领域,每一领域应该用什么技术与工具来组织,不同领域又如何通过某些框架来有机地结合在一起。仅凭一本书,想完全满足所有人的需求是非常困难的。
阅读本书,我最大的感受就是:全和新。
全指的是内容覆盖面较广。原本我以为作者会主要讲Flask 框架的开发,但其实Flask 框架在本书中的比重并不大,反而是与Web 相关的开发技术的介绍占了大部分的篇幅,甚至也包含了部署以及Python 本身的一些特性和工具。对此我也有疑问,并向作者咨询。Web 开发的概念其实太大了,不同的角度可以有不同的理解。比如我们常说的Web 框架,其实绝大部分都只涉及展示相关的开发,所以应该更精确地称之为Web 展示框架或Web 应用框架。但是它很有可能依赖底层的批处理、大数据处理等技术,这些虽然不能算纯粹的Web技术,但是却可以放在Web 开发这一概念下。因此如果把每一块与Web 开发相关的内容都写出来,那么本书的厚度就可想而知了。所以作者是从个人实践的角度出发,把他所理解的与Web 开发相关的技术尽可能全地,并且尽可能用更多的实例来讲述。之所以我会有全这个感受,因为书的内容涉及了Web 框架、Ajax 的前后端交互、测试、数据库、数据分析、服务化、部署、系统管理、常用工具等内容,有点百科全书的意味。
为什么说新,因为书中讲的许多东西都是现在正在流行的技术或工具,像Flask、Celery、Jupyter、Supervisor、SaltStack、Pandas 等。其中有些我还是第一次接触,说明作者平时接触的内容的确非常丰富,同时也结合了豆瓣的一些具体的实例,这样会更有借鉴意义。
全书的难度不是很大,内容广泛全面,不过因为篇幅所限,对于前端的技术介绍得不多,有些章节可能描述也不是太细。不过前端技术虽然也算是Web 开发技术,但是与Python 的关系就不那么紧密了,本书毕竟是一本Python 相关的书,所以涉及不多也是正常的。而且许多具体的技术本身内容都很丰富,也绝不是短篇幅可以说清楚的,所以反而有个基础性的介绍,在需要时自行学习可能更好。因此本书比较适合对于Web 开发有一定了解,但是希望了解更多Python Web 开发技术的读者。
非常感谢作者把自己的经验分享给大家。
李迎辉
Python 开源资深行者
Python-CN 邮件列表创建人
UliPad 和Uliweb 作者
|
|