web.py模板的实现原理
web.py的模板实现利用了Python的可执行对象的动态特性:根据模板内容和渲染函数的参数创建一个函数,该函数执行的时候会返回一个TemplateResult类实例,该实例的字符串化就是模板对应的HTML内容。
为了说明web.py的模板是如何实现的,我们需要在web.py的模板实现代码中加入一些打印语句来显示中间结果。Python的virtualenv工具很好的实现了这个需求。另外,我还使用了iPython,不过Python标准命令行也是可以的。环境搭建的步骤简述如下:
virtualenv env
cd env
以及source bin/activate
pip install web.py
这个web.py库会被安装在virtualenv环境的目录下:
123 | (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行),加入一行打印语句:
1234567891011121314151617 | 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: ... |
下面我们就可以来看看模板函数到底长什么样了。当然,首先得创建一个模板文件。在我们的实验环境中进行如下操作:
12345678 | (env)➜ ~/programming/python/env $ lsbin include lib local(env)➜ ~/programming/python/env $ mkdir app(env)➜ ~/programming/python/env $ lsapp bin include lib local(env)➜ ~/programming/python/env $ cd app(env)➜ ~/programming/python/env/app $ mkdir templates |
现在,在templates目录下创建一个最简单的模板,文件名为hello.html,内容如下:
12 | hello, world |
下面来看看根据这个模板生成的函数到底长什么样子,在实验环境下启动ipython或者python,进入到app目录:
1234567891011121314 | (env)➜ ~/programming/python/env/app $ ipythonWARNING: 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目录:
|