第1章 初识Python Web开发 1
PythonWeb开发介绍 1
为什么应该选择Python作为Web开发语言 2
选择Python2还是Python 3 2
Web框架介绍 3
主流Web框架 3
小众的Web框架 5
选择Web框架时应遵循的原则 5
第2章 Web开发前的准备 7
搭建一个能运行的虚拟机环境 7
安装VirtualBox 8
使用Vagrant安装 8
使用Docker安装 10
包管理和虚拟环境 13
包管理 13
使用pip替代easy_install 13
distribute、distutils和setuptools 14
entry_points 15
插件系统 16
虚拟环境 17
virtualenv 18
virtualenv定制化 18
virtualenvwrapper 21
virtualenv-burrito 23
autoenv 24
进阶篇:pip高级用法 25
命令自动补全 25
普通用户安装 25
编辑模式 25
使用devapi作为缓存代理服务器 26
PYPI的完全镜像 27
第3章 Flask Web开发 28
Flask入门 29
安装Flask 29
从HelloWorld开始 29
配置管理 31
调试模式 32
动态URL规则 32
自定义URL转换器 33
HTTP方法 34
唯一URL 35
构造URL 36
跳转和重定向 36
响应 38
静态文件管理 40
即插视图 40
蓝图 43
子域名 43
命令行接口 44
模板 46
Jinja2 46
Mako 52
使用MySQL 60
安装MySQL和驱动 61
设置应用账号和权限 61
用MySQLdb写原生语句 62
事务提交和回滚 63
ORM简介 64
使用SQLAlchemy 65
使用ORM 67
数据库关联 69
在Flask中使用SQLAlchemy 71
记录慢查询 73
理解Context 74
本地线程 74
Werkzeug的Local 75
flask.request 76
使用上下文 77
使用LocalProxy替代g 80
从零开始实现一个文件托管服务 80
首页 84
重新设置图片页 86
下载页 87
预览页 87
短链接页 88
第4章 Flask开发进阶 89
Flask的信号机制 89
Blinker的使用 89
Flask中内置的信号 90
自定义信号 92
信号订阅的高级用法 92
Flask-Login中的信号 93
Flask的扩展 95
Flask-Script 95
Flask-DebugToolbar 97
Flask-Migrate 98
Flask-WTF 100
Flask-Security 102
Flask-RESTful 109
Flask-Admin 111
Flask-Assets 115
Werkzeug的使用 118
DebuggedApplication 118
数据结构 120
功能函数 121
密码加密 122
中间件 123
第5章 REST和Ajax 127
什么是REST 127
RESTfulAPI设计指南 128
使用名词来表示资源 128
关注请求头 129
合理使用请求方法和状态码 129
正确地使用REST 130
对输出的结果不再包装 131
不要做出错误的提示 131
使用嵌套对象序列化 131
版本 132
URI失效和迁移 132
信息过滤 132
速度限制 133
缓存 133
并发控制 134
使用Ajax 135
第6章 网站架构 140
Python应用服务器 140
WSGI协议 141
常见的WSGI容器 141
Web服务器Nginx 143
Web服务器与应用服务器的区别 143
为什么要选择Nginx 143
安装Nginx 144
使用Nginx部署Flask应用 144
缓存系统Memcached 149
Libmc安装配置 150
使用原生SQL缓存 152
缓存更新策略 157
Memcached使用的经验 157
键值对数据库Redis 157
操作Redis 158
Redis应用场景 159
分片和集群管理 168
NoSQL数据库MongoDB 169
为什么使用NoSQL 169
MongoDB 169
使用pymongo的例子 171
使用Mongoengine的例子 174
MongoDB实践经验 176
大型网站架构经验 182
缓存 183
负载均衡 183
高可用 184
业务拆分 184
集群 184
第7章 系统管理 186
进程管理Supervisor 186
Supervisor组件 187
配置Supervisor 187
使用Supervisor 190
应用部署Fabric 193
Fabric应用接口 194
使用Fabric管理Flask应用 197
配置管理工具SaltStack和Ansible 199
SaltStack 200
Ansible 207
使用Psutil 213
使用Sentry收集错误信息 215
安装配置Sentry 216
启动Sentry 218
创建团队和项目 218
配置SDK 220
使用StatsD、Graphite等搭建Web监控 223
配置Graphite 225
使用StatsD 226
配置Diamond 227
发布指标项 227
使用Grafana 228
使用Kenshin 232
第8章 测试和持续集成 233
使用unittest和doctest做测试 233
unittest 233
doctest 236
使用py.test和mock 237
py.test 237
mock 241
持续集成 243
使用Tox集成 248
第9章 消息队列和Celery 250
使用Beanstalkd 251
使用Beanstalkc 252
深入理解RabbitMQ 253
AMQP 254
虚拟主机 258
插件系统 258
通过Web和RESTAPI管理RabbitMQ 259
故障转移 262
使用Celery 262
Celery的架构 263
Celery序列化 265
安装配置Celery 265
从一个简单的例子开始 265
指定队列 268
使用任务调度 269
任务绑定、记录日志和重试 270
在Flask应用中使用Celery 271
深入理解Celery 274
Celery的依赖 274
任务调用 277
信号系统 278
Worker管理 279
监控和管理Celery 280
子任务 281
进阶篇:Celery最佳实践 283
使用自动扩展 283
善用远程Debug 283
合理安排任务周期 284
合理使用队列和优先级 285
保证业务逻辑的事务性 285
关闭你不想要的功能 285
使用阅后即焚模式 285
善用Prefetch模式 286
善用工作流 286
第10章 服务化 288
为什么需要服务化 288
RPC框架 289
服务化带来的问题 290
微服务架构 290
使用Thrift 291
定义IDL文件 292
服务端实现 294
客户端实现 297
PIDL——豆瓣的服务化实践 301
PIDL架构 302
第11章 数据处理 305
使用MapReduce做日志分析 305
使用MapReduce 305
使用DPark 309
分布式文件系统MooseFS 309
Mesos 310
配置DPark环境 311
从WordCount开始 314
PV&UV统计 316
数据报表 320
发送带有样式和附件的邮件 320
创建xlsx文件 325
使用Pandas 328
Pandas入门 329
读取MySQL数据库 332
和Flask应用集成 332
第12章 帮助工具 336
IPython 336
IPython交互模式 338
常用的Magic函数 338
配置和自定义IPython 341
IPython的扩展系统 342
使用IPython调试复杂代码 343
双进程模型 344
并行计算 345
Jupyter Notebook 347
Notebook格式 350
Notebook式转换和预览 351
为什么使用RequireJS 352
在Notebook里使用Echarts 353
富显示 355
自定义JavaScript和CSS样式 356
使用nbextension扩展Notebook 358
在Notebook上使用并行计算 359
调试和Debug工具 360
了解Linux服务器运行情况 360
性能测试 366
Python程序性能分析 369
性能调优实践 373
进阶篇:定制基于IPython的交互解释环境 374
进阶篇:豆瓣东西的Jupyter Notebook实践 376
第13章 Python并发编程 383
使用多线程 385
使用Gevent 392
使用多进程 399
使用Future 406
使用asyncio 408
async/await 409
Future 412
使用aiohttp 414
使用队列 416
第14章 Python进阶 418
使用标准库模块 418
errno 419
subprocess 420
contextlib 421
glob 424
operator 424
functools 426
collections 428
Python语法最佳实践 432
命名 434
使用join连接字符串 435
EAFPvsLBYL 435
定义类的_str_/_repr_方法 436
优美的Python 437
从Python 3移植 439
partialmethod 439
singledispatch 440
suppress 442
redirect_stdout/redirect_stderr 443
使用CFFI/Cython编写Python扩展 444
使用CFFI 444
使用Cython 447
进阶篇:使用PyObjC发送通知 451
第15章 Web开发项目实践 455
Web项目经验总结 455
开发流程 455
使用合理的项目结构 456
关注代码复杂度 457
代码质量保证工具 457
Pycodestyle对中文缩进的处理 458
Flake8 459
Pylint 460
其他代码质量保证工具 461
使用AST做静态检查 461
其他静态检查工具 467
编写Flake8扩展 468
代码评审的意义 470
作为被评审者 471
作为评审者 472
评审的标准 473