web.py模板的实现原理
web.py的模板实现利用了Python的可执行对象的动态特性:根据模板内容和渲染函数的参数创建一个函数,该函数执行的时候会返回一个TemplateResult类实例,该实例的字符串化就是模板对应的HTML内容。
实验环境搭建
为了说明web.py的模板是如何实现的,我们需要在web.py的模板实现代码中加入一些打印语句来显示中间结果。Python的virtualenv工具很好的实现了这个需求。另外,我还使用了iPython,不过Python标准命令行也是可以的。环境搭建的步骤简述如下:
- 创建virtualenv环境:
virtualenv env
- 激活virtualenv环境:
cd env
以及source bin/activate
- 安装web.py:
pip install web.py
这个web.py库会被安装在virtualenv环境的目录下:
1 2 3 |
(env)➜ ~/programming/python/env/lib/python2.7/site-packages/web $ pwd /home/diabloneo/programming/python/env/lib/python2.7/site-packages/web |
下面就可以修改这个web.py的代码来看看模板到底是如何实现的。
实验代码修改
我们要修改的代码位于web/template.py文件内,找到Template类的compile_template函数(在template.py文件的第900行),加入一行打印语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def compile_template(self, template_string, filename): code = Template.generate_code(template_string, filename, parser=self.create_parser()) def get_source_line(filename, lineno): try: lines = open(filename).read().splitlines() return lines[lineno] except: return None print code # 这行就是我们增加的调试语句,可以打印出前面提到的动态生成的函数。 try: # compile the code first to report the errors, if any, with the filename compiled_code = compile(code, filename, 'exec') except SyntaxError, e: ... |
模板函数到底长什么样?
下面我们就可以来看看模板函数到底长什么样了。当然,首先得创建一个模板文件。在我们的实验环境中进行如下操作:
1 2 3 4 5 6 7 8 |
(env)➜ ~/programming/python/env $ ls bin include lib local (env)➜ ~/programming/python/env $ mkdir app (env)➜ ~/programming/python/env $ ls app bin include lib local (env)➜ ~/programming/python/env $ cd app (env)➜ ~/programming/python/env/app $ mkdir templates |
现在,在templates目录下创建一个最简单的模板,文件名为hello.html,内容如下:
1 2 |
hello, world |
下面来看看根据这个模板生成的函数到底长什么样子,在实验环境下启动ipython或者python,进入到app目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
(env)➜ ~/programming/python/env/app $ ipython WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv. Python 2.7.8 (default, Oct 20 2014, 15:05:19) Type "copyright", "credits" or "license" for more information. IPython 1.0.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features.2f83633006614-7">? -> Introduction and overview of IPython's features.ݕ实现的,我们需要在web.py的模板实现代码中加入一些打印语句来显示中间结果。Python的virtualenv工具很好的实现了这个需求。另外,我还使用了iPython,不过Python标准命令行也是可以的。环境搭建的步骤简述如下:
这个web.py库会被安装在virtualenv环境的目录下:
下面就可以修改这个web.py的代码来看看模板到底是如何实现的。 实验代码修改我们要修改的代码位于web/template.py文件内,找到Template类的compile_template函数(在template.py文件的第900行),加入一行打印语句:
模板函数到底长什么样?下面我们就可以来看看模板函数到底长什么样了。当然,首先得创建一个模板文件。在我们的实验环境中进行如下操作:
现在,在templates目录下创建一个最简单的模板,文件名为hello.html,内容如下:
下面来看看根据这个模板生成的函数到底长什么样子,在实验环境下启动ipython或者python,进入到app目录:
|