Python 在Web 2.0网站的应用
关键词:python web应用 python开发web应用 python web开发
洪大侠有些遗憾在QCon上面由于时间的限制没能将后面Python实际应用部分的例子讲解透彻。所以这次略微简化了些前面的介绍部分,直接引入那些讲述了Python语言最优秀部分的特性是如何在实战中得到应用的。不过需要注意的是,如果是对于这些特性没有简单了解的Python初学者,欣赏这部分的乐趣依然存在但是可能会降低。而鉴于洪教授的Slides上,这部分没有什么详尽的文字说明,所以自己的记录旨在能够帮助大家作为学习Slides部分的一些简单提示。欢迎大家与Slides一起来配合学习。
Python的介绍
- 目标:提高开发效率,降低开发成本
- 代码比例:Slides中给出的比例描述的是豆瓣所有项目中的比例,如果只计算网站前端部分的话,那么Python的比例大概有70%多。
为什么使用Python?
- 简单易学、开发迅速、易于协作。着重说了第三点”易于协作”。因为如果单独就开发效率来讲Perl的效率也很高,但是Python语言的特性可以避免强烈的个人风格,从而更适合团队开发。
- 部署方便:三条语句完成上线功能
- 适用面广:前台后台各种应用
- 资源丰富:内置电池,应有尽有的库可以选择
概述一下讲解的Python的一些优点以及相应的库或工具
- 简单的Web开发代码展示-Douban后台的WebService都是用Web.py开发的
- 使用更新颖的Flask框架,代码写起来甚至比Web.py更简单
- Python开发Web简单得益于WSGI,该标准将一个请求分解为不同的中间件来进行处理。当然造成 Python Web Framework众多的原因也是因为这个。
- nose-使单元测试变得简单
- numpy-用于数据分析
- iPython-好用的命令界面扩展,幻灯中演示了直接在iPython中通过数据来绘图
- virtualenv-方便部署和建立一个干净的Python环境
- Python的速度不快,基本和Perl一个量级-用C扩展:Douban用的多的是 PyRex/Cython,用类似于Python的语法去写C的扩展
- 哲学上和其他语言的差异:做一件事情只有一种方法(Py) vs 做一件事情可以有多种方法(Perl)
- Pythonic-http://bit.ly/pyzencn
利用Python的语言特性简化开发
案例零:本机和线上配置的不同,如何方便解决
- 使用.py文件作为配置文件,在使用时将该文件 import 进入程序。
案例一:网站页面权限控制的Pythonic解决方案
- 使用Decorator把权限处理的代码部分抽象出来
- Decorator和四人帮中的描述的装饰器模式并不完全对等
- Py中的函数可以当作对象使用
- 使用__call__来简化代码
案例二:从队列中提取信息调用相应的函数
- 原始的代码设计需要在代码中放入大段的If.Else来进行处理
- 被装饰的函数,先换个名字
- 将函数序列化后存入队列中,Work通过名称找到相应的模块和函数执行
- 现场观众提出的问题是,在get_attr这部分的性能损耗如何?答:可以忽略,Python内部有对这方面的考虑
- 在生产环境中,豆瓣使用RabbitMQ作为队列系统
案例三:Memcache
- 用的是Python-libmemcached(由豆瓣开源的),在这个页面http://code.google.com/p/memcached/wiki/Clients#Python 可以查到不同库的比较。
- 变化的key使用decorator如何处理?
- 传进去一个可以解释的表达式
- 使用inspect.getargspec
- get_key这个返回值,是一个函数,产生memcache的key时使用的
- hint中说的是生成KEY的方式:如果你有更好的方式,欢迎发给Douban,这个会为应聘豆瓣加很多分值
案例四:使用迭代器减少不必要的性能开销
- iterator和generator
- itertools供迭代器所使用的库
- 通过迭代器来减少遍历时数据库访问产生的性能开销
- imerge把一组迭代器按照顺序进行排序(不在标准库中)
- generator是简化代码的利器
案例五:序列化操作时间优化,元类操作
- 简单对象,需要处理的量太大(豆瓣的收藏对象)反序列化的速度太慢,造成瓶颈
- CPickle vs Marshal 性能对比,Marshal的性能大约提升7倍,同时空间还有43%的节省
- Marshal只能处理内部类型,怎么才能使用其来处理Python中的自定义对象呢?
- 从Python 2.6中增加的namedtuple得到启发,使用类似的方法来完成这个工作
- 首先要明确Python中类的观念,类也是从元类派生出来的
- 使用元类,在实例化这个类的过程中进行一个序列化该对象信息的操作,而这部分可以很方便地被Marshal所使用
- 需要注意的是:Meta操作如果处理不当,容易被滥用,从而导致很多可维护性上的问题。推荐只将其用于框架类的实现上,而避免在应用层运用此类实现。
案例六:Descriptor的简单讲解
- 使用 Descriptor
- 将对应变量名称作为类中的属性
案例七:让urllib库实现通过代理翻墙
- 使用 Monkey Patch 方法来解决这个问题
Python的一些实现:
- Stackless Python:微线程,类似Erlang,高效并行
- IronPython,PyPy:据说效率都已经超过CPython了
Q&A环节:
- 关于框架的选择问题:历史原因,如果现在从头开发新的网站,使用现代化框架
- 变量命名规范:遵守PEP8规范,尽管不是必须
- BeansDB应用于:图片、MP3、大文本字段