PythonWeb开发实战
PythonWeb开发实战
一次真诚的倾诉
业界热评
为什么写这本书
谁应该看本书
为什么值得看
本书的特别用法
本书的组织方式和阅读建议
使用代码示例
反馈和勘误
1 初识Python Web开发
Python Web开发介绍
为什么应该选择Python作为Web开发语言
选择Python 2还是Python 3
Web框架介绍
主流Web框架
小众的Web框架
选择Web框架时应遵循的原则
2 Web开发前的准备
搭建一个能运行的虚拟机环境
安装VirtualBox
使用Vagrant安装
使用Docker安装
包管理和虚拟环境
包管理
使用pip替代easy_install
distribute、distutils和setuptools
entry_points
插件系统
虚拟环境
virtualenv
virtualenv定制化
virtualenvwrapper
virtualenv-burrito
autoenv
进阶篇:pip高级用法
命令自动补全
普通用户安装
编辑模式
使用devapi作为缓存代理服务器
PYPI的完全镜像
3 Flask Web开发
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开发进阶
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
什么是REST
RESTful API设计指南
使用名词来表示资源
关注请求头
合理使用请求方法和状态码
正确地使用REST
对输出的结果不再包装
不要做出错误的提示
使用嵌套对象序列化
版本
URI失效和迁移
信息过滤
速度限制
缓存
并发控制
使用Ajax
6 网站架构
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 系统管理
进程管理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 测试和持续集成
使用unittest和doctest做测试
unittest
doctest
使用py.test和mock
py.test
mock
持续集成
使用Tox集成
9 消息队列和Celery
使用Beanstalkd
使用Beanstalkc
深入理解RabbitMQ
AMQP
虚拟主机
插件系统
通过Web和REST API管理RabbitMQ
故障转移
使用Celery
Celery的架构
Celery序列化
安装配置Celery
从一个简单的例子开始
指定队列
使用任务调度
任务绑定、记录日志和重试
在Flask应用中使用Celery
深入理解Celery
Celery的依赖
任务调用
信号系统
Worker管理
监控和管理Celery
子任务
进阶篇:Celery最佳实践
使用自动扩展
善用远程Debug
合理安排任务周期
合理使用队列和优先级
保证业务逻辑的事务性
关闭你不想要的功能
使用阅后即焚模式
善用Prefetch模式
善用工作流
10 服务化
为什么需要服务化
RPC框架
服务化带来的问题
微服务架构
使用Thrift
定义IDL文件
服务端实现
客户端实现
PIDL——豆瓣的服务化实践
PIDL架构
11 数据处理
使用MapReduce做日志分析
使用MapReduce
使用DPark
分布式文件系统MooseFS
Mesos
配置DPark环境
从WordCount开始
PV&UV统计
数据报表
发送带有样式和附件的邮件
创建xlsx文件
使用Pandas
Pandas入门
读取MySQL数据库
和Flask应用集成
12 帮助工具
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并发编程
使用多线程
使用Gevent
使用多进程
使用Future
使用asyncio
async/await
Future
使用aiohttp
使用队列
14 Python进阶
使用标准库模块
errno
subprocess
contextlib
glob
operator
functools
collections
Python语法最佳实践
命名
使用join连接字符串
EAFP vs LBYL
定义类的__str__/__repr__方法
优美的Python
从Python 3移植
partialmethod
singledispatch
suppress
redirect_stdout/redirect_stderr
使用CFFI/Cython编写Python扩展
使用CFFI
使用Cython
进阶篇:使用PyObjC发送通知
15 Web开发项目实践
Web项目经验总结
开发流程
使用合理的项目结构
关注代码复杂度
代码质量保证工具
Pycodestyle对中文缩进的处理
Flake8
Pylint
其他代码质量保证工具
使用AST做静态检查
其他静态检查工具
编写Flake8扩展
代码评审的意义
作为被评审者
作为评审者
评审的标准
思维导图
防止博客图床图片失效,防止图片源站外链:
http://www.processon.com/chart_image/5e5b4b0de4b02bc3ad6a32af.png)
思维导图在线编辑链接: