模板与编码HTML
我有一个网页应用,里面有一些HTML表单,用来维护一些表格(使用SQLite数据库,CherryPy作为网页服务器)。一开始,我完全是按照“Python的方式”来做的,通过代码生成HTML字符串,常用的头部、尾部等内容作为函数放在一个单独的模块里。
我也喜欢模板的想法,所以我尝试了Jinja2,这个工具对开发者很友好。最开始我觉得模板是个好主意,但那时页面比较简单。后来引入了.css和.js文件(不一定和.html文件放在同一个文件夹里),还有越来越多的{{...}}变量和{%...%}命令,设计的时候就开始变得混乱,尽管运行时效果很好。当我需要在
或部分添加额外的JavaScript时,事情变得更加复杂。从我看到的情况来看,使用模板的主要优点是: 页面中非动态的部分在设计时可以很容易地在浏览器中查看。 除了{}占位符,HTML和Python代码是分开的。 如果你的公司有网页设计师,他们可以在不懂Python的情况下进行设计。
而一些缺点是: 在浏览器设计时查看时,{{}}分隔符是可见的。 相关的.css和.js文件必须放在同一个文件夹里,才能在设计时在浏览器中看到效果。 数据、变量、列表等必须提前准备好,或者声明为全局变量,或者作为参数传递给render()函数。
那么,什么时候使用“硬编码”的HTML,什么时候使用模板呢?我不太确定最佳的做法,所以我很想听听其他开发者的看法。
谢谢,Alan
5 个回答
我非常推荐使用模板。模板可以帮助你的应用程序保持良好的MVC结构。我的观点是,Python代码不应该直接生成HTML。我这么说的原因是,Python代码应该负责处理逻辑,而不需要担心如何展示内容。模板的语法通常比较严格,这样你在模板里就不能做太多的逻辑处理,但你可以处理任何与展示相关的逻辑。
每个人的情况可能不同。
虽然我不是Python开发者,但我在这里回答一下——我觉得使用模板的想法在PHP和Python中都是很常见的。
使用模板有很多好处,比如:
- 保持代码整洁。把“逻辑”部分(控制器代码)和“展示”部分(视图)分开是非常重要的。要是项目里混合了HTML、CSS、JS和Python,那工作起来会非常麻烦。
- 把HTML放在单独的文件里,不需要你去修改代码本身。例如,如果你在控制器代码(Python代码)里放入某些内容,可能需要在每个“字符前加个斜杠,这样会很麻烦。
- 你可以让你的网页设计师学一些模板语法的基础知识,这样他就能在不破坏你控制器代码的情况下帮助你(因为没有经验的人修改代码时常常会出问题)。
其实还有很多其他好处,但这些对我来说是最重要的。
唯一的缺点是你需要把参数传给渲染函数……不过这并不需要太多工作。总的来说,这比维护一个混合了控制器代码和视图代码的项目要简单得多。
一般来说,你可以看看这个关于>MVC优缺点的问题<:什么是MVC,它有什么优点?
解决静态文件问题最简单的方法就是在你的HTML中使用相对路径来引用它们。例如:<img src="static/image.jpg" />
如果你愿意多花一点时间,可以通过写一个小服务器来解决你提到的所有设计问题,这样可以更好地展示你的模板。
- 维护一个文件,里面存放简单的数据结构,包含你所有模板的示例值。
- 使用像Werkzeug这样的微框架,在你的本地机器上提供HTTP服务。
- 写一个根请求处理程序,扫描你的数据结构列表或模板目录,生成一个包含所有模板链接的索引页面。
- 为非根请求写一个次级请求处理程序,它会根据请求的模板名称,渲染出相应的数据结构。
你可以在几个小时内写出这个工具,它会让模板设计变得非常方便。Werkzeug内置的wsgi服务器有一个不错的功能,就是当它检测到文件发生变化时,可以自动重载自己。这样你可以在编辑模板的同时,让这个小服务器一直运行,随时点击索引页面上的链接。