在学习Django模板之前我以为也和很多php模板引擎一样,是通过缓存文件输出,执行模板中的python代码来实现的。读完发现居然和前端模板相似,用了正则。
为了更好的体会设计的哲学,我同时参考了tornato、drupal、codeigniter、aceTemplate、underscore中的模板设计。
Django模板特点
1.不支持python代码,使用自己的标签关键字。
Django的模板设计时有个重要的假设是:“写模板的不懂python”。因此你只要搞告诉他基本的逻辑结构(判断、循环、输出变量等)的写法就行了。同时也避免了程序员将业务逻辑写道模板里。解析模板的时候和前端模板非常类似,也是用正则提取除所有的代码部分,然后顺序解析(解析的时候根据实际情况构造作用域)成html。
tornato的模板支持原生python。它的思路是将整个模板转换成python语句,最后执行。这和前端模板的思路几乎是一样的了。aceTemplate在这种思路上做得最好,它支持代码和标签的自由穿插,也就是不许要特殊标记表示哪里是代码哪里是html标签。前端模板还有个比较通用的特点就是将模板编译成函数之后会缓存,下次调用时直接执行函数就行了。tornato是否支持这种形式我没有考证。
php中模板实现得比较简单,主要是通过缓冲输出流来实现的。模板中使用的就是正常的php代码。这主要也是因为php文件把不在php标记中的文本都直接输出的特性。所以php的模板就本上都是能直接执行php代码的。
这里可以看出两种完全不同的设计思路,Django是主动对模板使用者设限,想当于自己实现了一个小的模板语言。而tornato、php模板和前端模板则是让尽量让开发者减少学习成本,同时获得极大的自由。不过前端模板让开发者获得极大自由的主要原因是html和前端逻辑几乎都是统一个人写的。
2.支持模板嵌套
知道了Django的模板实现原理页就不难了解他的嵌套实现了,这里Django和tornato实现的思路是一样的,就是读到“include”标签的时候再去找相应的嵌套模板。php和前端的嵌套实现则是通过手动写调用子模板的代码实现的。
3.支持模板继承
模板继承我之前在php模板和前端模板中没有见过,可能是我孤陋寡闻了。刚看到支持继承的时候我在想“难道还实现了一个html parser吗”?事实证明我想多了。tornato和Django都仍然通过自定义代码标签来替换需要继承的部分这种形式。
总结
以下几点是我觉得有意思的:
1. 无论哪种模板实现,其实本身和html没有一毛钱关系。
2. 要论速度,肯定是像php这种直接缓存输出流的最快。毕竟省了模板编译这一步。tornato生成python语句之后如果也是封装成函数,那么应该是可以缓存的,没有考证。
3. Django模板实现的方式也许和整个框架的设计理念是相关的,我还没有看完,不妄下评论。不过至少在书里面说起清楚了为什么这么做。
刚开始学python和Django,有写的不对的地方感谢读者指正。