web.py源码分析: 模板(1)
admin
2023-07-31 00:45:45
0

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环境的目录下:

123 (env) ~/programming/python/env/lib/python2.7/sitepackages/web  $ pwd/home/diabloneo/programming/python/env/lib/python2.7/sitepackages/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标准命令行也是可以的。环境搭建的步骤简述如下:

  • 创建virtualenv环境:virtualenv env
  • 激活virtualenv环境:cd env以及source bin/activate
  • 安装web.py:pip install web.py

这个web.py库会被安装在virtualenv环境的目录下:

123 (env) ~/programming/python/env/lib/python2.7/sitepackages/web  $ pwd/home/diabloneo/programming/python/env/lib/python2.7/sitepackages/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.iv>

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...