zz《WEB2.0网站开发 – Python篇》 网页模板

source:http://9.douban.com/subject/9343904/

原来python也是可以用来开发网页的!

 

Martin Fowler, 某软件工程砖家,曾经拍出一块板砖:
也许我们正在迈进这样的一个新时期:在这个时期内,我们将见证多种语言在同一个项目上的应用,人们就像现在选择框架一样,根据功能来选择相应的语言
事实上,对于Python写的Web应用,早已迈进多语言编程(Polyglot Programming)的时代。
人们开始混合使用语言,并像用类库一样频繁地使用DSL。
DSL(Domain Specific language),领域特定语言。它不像通用编程语言那样试图涵盖一切软件问题,它是一种面向特定问题的特定语言。最常见是DSL就是查询数据库的SQL语言了。
网页模板,也是一种DSL,它往往有着自己特定的语法和指令,专注于动态的去生成网页 — 为了生成字符串的而生的语言
由DSL引出了一个概念 — 面向语言编程。

面向语言编程,让开发者的思维方式从思考函数、接口,转变为思考词汇和语法。面向语言编程试图创造出更容易阅读的代码。对于网页模板来说,它的确做了这一点。

Django的开发者在Django的入门手册中写到:不像其他Web程序组件,程序员对模板系统的意见非常不一致 。

    一个很有意思的事实:Python至少拥有数十个——如果没有上百个——的开源模板语言实现,而且看来每一个都是因为其创造者认为现有的模板不能满足他们的要求。
事实上,据说写一个自己的模板系统是已经成了Python开发者必经的仪式了。如果你还没有写过自己的模板系统,试试看吧,真是很有意思。

诚如所言,Python中面向语言编程的概念早已深入人心 — 你想成为XX语言之父吗?动手吧。
到此为止,上述这些概念都是满纸荒唐言的扯淡,对于实际开发毫无意义。但作为唬人基本素质课程,请认真学习,贯彻执行,树立高手良好形象。千万不要低估忽悠的功用,它是思潮,它是信仰,它代表人类世界的精神文明,它有着摧枯拉朽的力量。

言归正传,从风格流派上分为这么几大类:

1. ** 网页归网页,Python归Python,代表作品 Django的Template。
Django起源网站外包的公司。在外包公司的网站开发中,创意,性能,可扩展性,可用性,都不是第一需要考虑的东西。第一要素,是客户需求。满足客户需求,快速开发出能够上线运营的东西,是其生存之道。
成规模的外包公司往往会借鉴工业上流水线作业的方式快速批量的生产网站。

说起流水线作业,不得不谈谈福特公司的汽车生产的经典故事。

对于汽车制造这件麻烦事,“流程分解、优化”推进得坚决而彻底,而且效果惊人。以活塞杆组装为例,按照老式的方法,28个人每天装配175只——每只3分5秒;工头用秒表分析动作之后,发现有一半时间用于来回走动,每个人要作六个动作,于是他改造了流程,把工人分成三组——再也不需要来回走动了,凳子上装了滑轮传动——现在 7个人就能每天装配2600只。

    …
以流程为本、保证流程本身的顺畅和效率是其精髓。运用这些原则,工人减少了无谓的思考和停留,把动作的复杂性减少到最低程度,几乎只用一个动作就完成一件事情。

流水线到底有多大的效用?
工人装配一台飞轮磁石电机曾经需要20分钟,后来工作被分解成29道工序,装配时间最终降低到 5分钟,效率提高了四倍;直到1913年10月,装配一台发动机还要十个小时,半年后用传动装配线降低到六小时。
福特改革了装配汽车的全过程。用绳子钩住的部分组装好的车辆被拖着从工人身旁经过,工人们一次只组装上一个部件。福特公司后来日产量达四千辆,工人还不到 5万——如果没有流水线,将不得不雇佣20多万人。
这一新的系统如此有效而且经济合算以致他将自己生产出来的汽车削价一半,降至每辆260美元,使那些在此之前一直买不起汽车的人都有能力买了。

好吧,简单的说。流水线作用就是细分工作流程,让每个工人只专注于一件事情,并把这件事情做成习惯和本能,以到达最高的工作效率。喜剧大师卓别林的经典之作《摩登时代》就是关于流水线的故事[注1]。
那么在网站批发的流水线上,编写页面前端开发者 和 编写网站逻辑的后端开发者 泾渭分明。负责前端的,不需要清楚后端开发人员的语言;负责后端的,不需要明白怎样去编写网页。
Django的Template正是这种思想下产生的作品。它不能在页面中写Python代码,很长一段时间类甚至不能做比较,等于这种基本运算(PS:最新的开发版中终于支持了)。它用一套自定义的标签体系,诸如 ifequal,ifnotequal,让页面编写者尽可能的回避编程的语言。这种明确分工的模板方式是好是坏,就像计划经济是好是坏一样,是个可以仁者见仁智者见智的话题了。

2. ** 网页点缀Python,代表作品 Mako网页混合Python,代表作品 pyTenjin
这两种方式,界限很模糊。他们都可以在网页中书写Python代码,只是通常的使用习惯上有些许差别。
前一种,编写的风格更像Django,网页中不提倡出现大段大段的Python代码。Python在页面中仅限于用来辅助一些文字转换,条件判断。后一种,编写的风格更像普通PHP,网页和数据逻辑可以写到一起 — 对于普通程序员,这是最自然写意的书写方式。
当然,风格因人而异,你想用一种模板写另一种风格,也未尝不可。

3. ** 网页就是Python,代表作品 PTL ,PTL(Python Template Language)是Quixote的模板引擎 (http://quixote.python.ca/quixote.dev/doc/PTL.html )。
豆瓣最初的模板就是PTL (开始有豆瓣的时候,很多优秀的模板尚未问世),它几乎就是Python文件 — 唯一的差别就是文件的后缀名和定义模板函数时加上的[html]。
PTL的速度非常之快,部分是由于PTL的核心代码是用C写的,部分是由于PTL几乎就是Python语言脚本。
模板选择中的种种矛盾 如同 社会中效率与公平常常出现的矛盾,不能生搬硬套的教条主义,需要根据实际的环境来取舍。
从趋势上说,网页和Python分离越清晰,对于不懂Python的前端页面编写人员越友好,但对于程序员就越麻烦,渲染速度也会稍慢一些。
Tenjin首页上有一个各大语言模板速度的测试,如下。
MacOS X 10.4 Tiger, Intel CoreDuo 1.83GHz, Memory 2GB

Language Template Engine Test#1(sec) Test#2(sec)
Python(2.5.1) pyTenjin (0.6.1) 6.96 5.61
Cheetah (2.0) 20.36 19.82
Django (0.9.5) 71.33 59.80
Myghty (1.1) 107.88 19.30
Kid (0.9.6) 380.24 378.96
Genshi (0.4.4) 560.30 271.69
Mako (0.1.9) 17.78 13.49
Templetor (web.py 0.22) 428.19 61.53
Ruby(1.8.6) rbTenjin (0.6.0) 7.34 4.52
eruby (1.0.5) 12.29 11.53
ERB(def_method) (Ruby1.8.6) 36.73 5.85
PHP(5.2.0) phpTenjin (0.0.1) 5.39 3.64
Smarty (2.6.18) 10.84 10.21
Perl(5.8.8) plTenjin (0.0.1) 10.42 5.72
Template-Toolkit(XS) (2.18) 103.58 26.30
HTML::Template (2.9) 46.70 30.21
JS(spidermonkey) jsTenjin (0.0.1) 19.00 12.98
JS(Rhino, JDK5) jsTenjin (0.0.1) 24.29 19.15
Java(JDK5) Velocity (1.4) 22.80 11.41
Velocity (1.5) 20.01 8.42

从它的测试可以得到一些有趣结论:

1.Genshi,Kid,这两个基于XML的Python模板性能差的离谱。
这也符合我一贯的观点,XML是一种很糟糕的格式,既不适合人阅读,也不方便机器解析。
与其相关的东西也多是鸡肋– XPath没有CSS选择器来的方便;至于XSLT之类的转换,就更复杂了,远没有直接写模板来的快捷。
几大巨头公司坐到一起,搞出来的东西往往就和COBOL一样臃肿难用。无怪乎很多年前,《编程之道》的作者对其COBOL极尽鄙夷之词。

    不论多么的微不足道,每种语言都有它自己的目的,每种语言都表达了软件的阴阳两极。每种语言都各得其道。
但是尽量不要用COBOL 语言。

以下语录的作者,编程大师隐者,在人们心目中的形象一直很模糊。他被COBOL 语言标准委员会的特务所暗杀,除此之外,人们对他知之甚少。
那些宣称XML是未来的吹鼓手,拿着某某人的卢布,毒害了多少无知的青少年啊。
2.Java未必比动态语言运行速度快,请注意观察 Test1 中Java的表现。速度对比要看应用场景。
此外,提醒大家,用静态语言Java写起网站来,比用动态语言痛苦很多。

通常情况下,从用户访问到页面加载完毕,模板渲染只占用了很小的一段时间片,很少会成为瓶颈。所以没必要对于其性能太斤斤计较。另外,还有不少上文没有提及的优秀模板,比如  Jinja http://jinja.pocoo.org/ ,作者是奥地利人 Armin Ronacher 。
Jinja类似Django的模板, 但是去除了Django模板的种种限制, 如不能调用函数, 不能使用 Python语句等。

它有两个版本,第二版性能不错, 作者的测试结果是速度和Mako相仿,比Django的模板快很多。Jinja的意思是日文神社,因为英文中 Template (模板) 和 Temple (庙宇) 有相似的发音, 作者就联想到了日本的神社。当然 神社 和 靖国神社 是两码事情。神社就是类似关公庙,土地庙,龙王庙中的“庙”这个字而已,没有什么特定的含义。

再来谈谈Python模板中常见的功能和语法糖

1.自动将输出数据中的特殊字符转义为HTML实体,如 <转换为&lt; , > 转换为 &gt; 。
如果想关闭转换,通常需要手工显式声明。
这样的好处是可以确保文本在HTML中显示正确,同时预防不经意间留下跨站脚本攻击(XSS)漏洞

2.网页模板通常支持 父模板 – 子模板 的功能 , 有时候也称之为 布局模板 – 内容模板 。

父模板的内容往往就如图所示,将整体的框架定好。

通用的导航,页脚等等,往往也在父模板中定义。可以使用多层父模板,来满足不同粒度的页面代码复用需求。
面向对象是一种编程思想,但是很多人先入为主的将 面向对象的思想 和 类结构的编程 等价起来。认为C++,Java的那种实现方式才是面向对象 。
面向对象的三个基本特征是:封装、继承、多态。父子模板满足这三个基本特征,完全可以给它们冠以 Object Oriented 的称号。
“浮名,一切都是浮名罢了…” 模板们谦虚的如是说。

最后,至于各个模板的具体用法,去看它们的文档吧。
总的说来模板文档是最好读的,看看输入输出就什么都明白了。
附上部分翻译好的文档链接。当然中文翻译有些过时是难免的,想用的话,还是看原文的好了。
Mako的模板文档翻译
http://www.cnblogs.com/rchen/archive/2007/06/15/mako_doc_translation_1.html
http://www.cnblogs.com/rchen/archive/2007/06/15/mako_doc_translation_2.html
http://www.cnblogs.com/rchen/archive/2007/06/15/mako_doc_translation_3.html
http://www.cnblogs.com/rchen/archive/2007/06/15/mako_doc_translation_4.html

Django的模板文档翻译
http://djangobook.py3k.cn/2.0

PTL模板的中文简介
http://blog.csdn.net/bvbook/archive/2009/08/14/4442406.aspx

我个人的喜好是Mako模板,在速度和易用性上比较平衡。


注释:

1. 福特可不是只会剥削劳动人民血汗的万恶的资本家。
“再没有比工资更重要的问题了。”这是汽车大王福特的工资观。
他在《我的生活与工作》一书中写道:“因为这个国家的大多数人都是靠工资生活的,他们生活水平的提高决定着这个国家的繁荣。”
上世纪初,福特公司以每天5美元的日薪招聘工人,成为当时轰动美国的大事,因为那时美国工人的平均日薪也就2美元。
不少人认为福特汽车公司会因为过高工资的拖累而倒闭破产,而福特汽车公司却蒸蒸日上,福特也成为享誉全球的汽车大王。
据统计,1914年初用于福特工人家庭生活的费用为325万美元,两年后这一数字增加到2000多万美元。当地贫困户的比例从20%降到了2%,工人在银行的 人均存款额从196美元增加到750美元。

正如曾在福特汽车公司工作过的一些工人后来在回忆中所说得那样:在得到了高工资后,在福特的工人们身上发生了许 多明显而有趣的变化。那些每天负责把午饭送到厂里的工人的妻子们最开始是用一块布包着头,后来戴起帽子,慢慢地,衣服也跟着漂亮起来了。而那些工人们的装 束也发生了变化,他们不再用手巾围在脖子上,而是戴上了领子。每个星期天,一些工人和妻子儿女还常常出去游玩。福特的工人当中,拥有一部T型车的也为数不 少,以至于当时在《底特律新闻报》上登载了一幅漫画:一名福特工人身着皮夹克,衣袋里露出钞票,眼睛盯着标有“高档商品”字样的货架。
“我就买了一辆T型车。”曾是一名福特工人的黑人女工克丽丝回忆说,“每到周末,我就开着它到城外探亲访友,到处游逛,那感觉真是好极了!”
“那时在底特律城,作为一名福特工人是一件光荣的事。”底特律就业协会的名誉会员,年龄已过90的安娜·克鲁琴这样告诉记者。福特汽车公司发给每个工人的厂牌是一快铜牌,形状有点像玫瑰花的花蕾,上面刻着鲜明的“FORD”字样·还有每个工人的编号。
“要知道,在当时的底特律,有了这块牌子就有了信誉,就有了生活的保障。这是一种骄傲,所以许多工人即使是在星期天上街,也把它擦得锃亮,戴在胸前,其他工厂的工人则投来羡慕的眼光。”
…. …. …. ….
“我觉得一个人或者一小撮人聚敛财产是无益的,因为这常常会伤害他人的利益……我没有理由将巨大的财产传给后代,我只有一个儿子,他也在工厂里做工。不管将来能积累起多么大的一笔财富,我都打算移交给我在工厂的那些同事们。”

福特派人在自己的工厂内进行了一次调查,把工厂的所有工作依照不同的类型区分为7882种,发现其中的949种工作需要身体强健而且五官健全的劳动 者;有3338种工作只需要有普通的体格和力气的劳动者;还有剩余的3595种工作是不需要什么体力的,也就是说,残疾人和弱智人也能胜任,在这当中,又有715种工作是一只手的工人也能做的,有2637种工作一只脚的工人也能完成,还有10种工作可以由盲人去做,2种可由无手的残疾人去做。

有了这样的调 查结果作依据,福特就开始大胆地雇佣这些被社会遗弃、被家庭厌恶的人来自己的公司做工挣钱。在底持律的大街上,福特经常走下汽车,来到露宿街头的乞丐、流 浪者和残疾人面前,和气地问他们是否愿意到他的工厂做工。他指示雇佣科的办事人员根据不同的特殊情况把这些特殊的劳动者分配到合适的工作岗位上。

在他回忆 录《我的一生和事业》中,亨利·福特回忆说:像这样有特殊情况的劳动者,在整个福特汽车公司总共有9563人,其中123人失去了一只手,有一个人两手全 无,有4个人是弱视,有207人仅有一只眼睛,253人双目失明,其他还有37名聋哑人,67名癫痢病人,234名工人有跛足,还有4人则失去了双脚或双 腿。福特还声称自己雇佣了400-600名犯人,一些是在出狱后走投无路的,还有一些是因为生活所迫铤而走险,后来亨利·福特与法庭达成协议,把其中罪行 较轻的一些人保释出来,成为福特工人。所有这些人出于对福特的感激,自然是拼命的工作。福特公司对这些劳动者采取一视同仁的态度,只要这些人能够胜任他们 负责的工作,照样可以得到和其他工人一样的5美元工资。
…. …. …. ….
好吧,之所以复制粘贴这么多,是因为之前看到一位我很尊敬的程序员大牛的博文。

技术人员应该研发符合穷人利益的项目
http://blog.csdn.net/lanphaday/archive/2009/12/29/5102038.aspx 

原创  不要放弃你的自由
http://blog.csdn.net/lanphaday/archive/2009/12/31/5109652.aspx 

感觉其 科技会降低穷苦人民生活质量 的观点有失偏颇。
我想如果不是流水线的生产方式带来的生产效率大为提高,福特再有造福社会的美好愿望也是无济于事的。
于此同时,生产效率的提高,给更多普通人以买车的机会。而这一切都是双赢的。
母亲从小教育我,学会做事之前先要学会做人。我想,在动手写程序之前,先树立一个科学的世界观很重要 :)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

生活在西班牙

自己动手丰衣足食

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

%d bloggers like this: