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扩展

代码评审的意义

作为被评审者
作为评审者
评审的标准

思维导图

PythonWeb开发实战

防止博客图床图片失效,防止图片源站外链:

http://www.processon.com/chart_image/5e5b4b0de4b02bc3ad6a32af.png)

思维导图在线编辑链接:

https://www.processon.com/view/5e5b4b0de4b02bc3ad6a32ac

posted @ 2020-08-05 11:54  哀莫  阅读(1498)  评论(0编辑  收藏  举报

欢迎访问我的主页!