Status: 草稿 ;HuangYi; 70%;

建议扩展成 Python Web应用框架纵论!

撰写原则::
  1. 对于Python 的 web 框架纵论, 应该中立和系统化,不能因为自个儿熟悉什么而忽视历史发展和现实着力去说,这对读者是种误导;
  2. 要从读者角度,而不是开发者角度来叙述,,,
开发流程::
  1. HY 提交撰写大纲
  2. 开放式讨论,确认思路和内容规围和深度后,细化内容定义
  3. 分头认领部分小节,组织各个领域专家进行撰写
  4. 由HY 重新整合,整体调整成为风格统一的文章来

结构讨论:: Python Web应用框架纵论

+-- 导论
|  +-- 现状
|  \-- 为什么Python 中有这么多框架?
+-- 分类
|  +-- 如何来理解各种框架?
|  +-- 框架的框架
|  +-- 轻型框架
|  +-- 一站式框架
|  \-- 模板系统
+-- 细说(按照历史顺序,选择经典框架来介绍,没有PCS独立章节的,和故事没有直接提及的)
|  +-- Zope/Plone (请潘俊勇撰写)
|  +-- Quixote (请 阿北或是朞其它豆瓣成员 撰写)
|  +-- Quixote (请 阿北 撰写)
|  +-- Django (HY自写)
|  \-- UliWeb (请Limodou撰写)
+-- 选择
|  +-- 个人
|  +-- 团队
|  \-- 企业
\-- 小结
  \-- 选择的痛苦

深入探讨 Python主流Web开发框架

在初步体验了一把 Django 的快速开发后,本章开始带你走入这些主流 Web 框架深处。 探索它们内部的奥秘。

在 Python 的世界,web 框架百家争鸣, 但却基本统一于 MVC 这样一个抽象的大模式之下。

对于框架来说,MVC 就像是一个骨架,骨架是一个框架的根本,骨架上缺了钙自然是万万 不行的。但我认为 Python Web 框架最重要的特质,还是对 DRY(Dont Repeat Yourself)、 COC(Convention Over Configuration) 这些基本原则的遵守,同时又在原则的纯粹性、开发 的灵活性和以及对开发者的易用性之间进行的微妙的权衡,这些都是框架设计的哲学,也是 这些框架的灵魂所在了。

但是从骨架讲起,总是比较容易理清思路的。

多少年来,MVC模式不断演化,各种变种相继出现然后消失。在 Python 的世界里, 这种种的变数,在近年却难得地达到了某种新的统一。

                            Model数据模型
URL分发器  Controller控制器
                            Template模板

上图便是最基本的骨架了。当http请求进入 web 应用程序的疆域, URL分发器首先根据提供的资源地址, 找到相应负责的控制器,控制器这里是核心的业务逻辑, 或是查询 Model 数据,在将数据填充到模板, 最终产生适当格式的资源的呈现(比如HTML); 或是处理表单,再通过 Model 持久保存数据,等等。

在搭建 Web 框架这样一座宏伟大厦的过程中,python开发者特别重视轮子的重用。 几个主流现代的框架中,组成它们的骨架和肉往往是一些独立的可重用的组件。 所以说 python 开发者都是聪明人:框架多样,可以形成激励不断创新的良性竞争; 重用性好,又可以节省昂贵的人力资源。

框架 URL分发器 模板 Model(ORM) Form 库
Django Django Django Django Django
TurboGears Object Publisher Genshi SQLAlchemy ToscaWidgets
Pylons Routes Mako SQLAlchemy ToscaWidgets
CherryPy Object Publisher -- -- --

当然这些只是几个最最基础的框架组成元素了,对于一个成熟的完善的框架来说, 还有许多必备的组件,比如cache、session、国际化(i18n)、用户验证、权限控制等等。 框架们往往还有一些自己独具的特性,比如django的app概念, 强悍的自动化后台管理程序,turbogears 的 toolbox ,与 ajax 的优秀集成等。 这些,可以称之为肉了。

Python web 框架的骨架和肉都是很灵活的。象上面这些框架,虽然默认的装备都很齐全了, 其实很多组成部分(比如模板系统)都是很松散的,完全可以很方便地进行替换。 因为web开发的实际情况是很复杂的,对于一个随时准备好迎接海量用户的 web2.0 站点来说,ORM往往成为鸡肋;而对于一个企业内部管理系统来说,一个 成熟的 ORM 却是快速开发的关键;对于程序员来说,mako 这样性能又高,又能够添加 复杂控制逻辑的模板引擎简直是完美(不过话说回来,在模板里添加太多的逻辑终究 也不是什么好事情);但对于缺乏技术背景的设计人员来说,也许会更青睐 django、genshi 这样简单易用的模板系统。

下面逐一介绍框架骨架的基本组成部分。

URL 分发器

  • Django 使用正则表达式定义 URL,很灵活很强大,对于懂正则的人来说是减少了学习成本, 但对于不懂的人来说则正好相反。URL 的定义集中,便于管理。示例代码:

    System Message: WARNING/2 (<string>, line 125)

    Literal block expected; none found.

  • Object Publisher 相当简单实用OO且Pythonic的方式,CherryPy和TurboGears中默认使用,示例代码:

    System Message: WARNING/2 (<string>, line 128)

    Literal block expected; none found.

  • Route Pylons框架默认的方式,模仿 RoR 的 URL 映射机制,使用专门的格式描述 URL,在很多 方面(比如易用性、功能)可以看做上面两种方式的折中。示例代码:

    System Message: WARNING/2 (<string>, line 132)

    Literal block expected; none found.

模板系统

  • Django 如果要我用一个字来形容,那就是简洁易用安全还有对设计人员友好,对于有些程序员来说, 也许有点简洁过头,当然这个主要取决与个人的审美观。示例代码:

    System Message: WARNING/2 (<string>, line 139)

    Literal block expected; none found.

  • Mako 可以直接实用 Python 代码嵌入模板,可以很灵活地编写控制逻辑。mako 在运行将模板编译成 Python代码,执行效率相当高。 示例代码:

    System Message: WARNING/2 (<string>, line 143)

    Literal block expected; none found.

  • Genshi 完全基于 XML 的模板,拥有很简单的控制语法,拥护web标准的页面制作同学应该会很欣慰。 同时也可以直接嵌入Python代码,满足开发人员的需求。 示例代码:

    System Message: WARNING/2 (<string>, line 147)

    Literal block expected; none found.

  • Jinja 沿着 Django 模板的方向,但走得更远。拥有和 Django 模板神似的语法,也拥有简洁易用 安全还有对设计人员友好同样的好处,但同时也允许直接内嵌 Python 代码。类似 mako, Jinja 也是编译型模板,拥有很好的执行性能。 示例代码:

    System Message: WARNING/2 (<string>, line 152)

    Literal block expected; none found.

ORM

  • Django 仍然是一贯的 Django 风格,简洁实用,功能相对不强。示例代码:

    定义Model
    查询 更新 删除
  • SQLAlchemy 无比强悍的 SQLAlchemy 是 Python 世界除 Django 以外 ORM 事实上的标准。 严谨的分层设计,支持大量的数据库后端,直接使用 Python 的查询语句, 继承、自引用(Self-referential)、eager loading、lazy loading 等等 丰富的特性。还可以直接将 Model 映射到自定义的 SQL 语句。可以说既不输于 Hibernate 强大的功能,同时不失 Python 式的优雅。 示例代码:

    System Message: WARNING/2 (<string>, line 168)

    Literal block expected; none found.

Caching

  • Django 提供一套统一的 API,和丰富的 cache 后端:Memcached、数据库、文件系统、内存, 甚至还有一个不cache的后端,方便开发时使用。另外如果现有这些不满意,还可以定制 自己的 cache 后端。
  • Beaker TODO

Form库

  • Django
  • FormEncode

其他

  • TocsaWidgets TODO

关于骨架和肉我们便说到这里为止,有了骨架,最后再吹一口仙气,框架便活了。 下面我们就来介绍一下这几个主流框架的灵魂:设计哲学。

Django

TODO

TurboGears

TODO

Pylons

TODO

CherryPy

TODO

ObpLovelyPython/WebFrameworks (last edited 2009-12-25 07:14:01 by localhost)