白话 Tornado 源码(5):褪去模板的外衣
admin
2023-07-30 22:32:12
0

上一篇《白话tornado源码(3):请求来了》介绍了客户端请求在tornado框架中的生命周期,其本质就是利用epoll和socket来获取并处理请求。在上一篇的内容中,我们只是给客户端返回了简单的字符串,如:“Hello World”,而在实际开发中,需要使用html文件的内容作为模板,然后将被处理后的数据(计算或数据库中的数据)嵌套在模板中,然后将嵌套了数据的html文件的内容返回给请求者客户端,本篇就来详细的剖析模板处理的整个过程。

概述

 (配图超大,请点击这里看大图)

上图是返回给用户一个html文件的整个流程,较之前的Demo多了绿色流线的步骤,其实就是把【self.write(‘hello world’)】变成了【self.render(‘main.html’)】,对于所有的绿色流线只做了五件事:

  • 使用内置的open函数读取Html文件中的内容
  • 根据模板语言的标签分割Html文件的内容,例如:{{}} 或 {%%}
  • 将分割后的部分数据块格式化成特殊的字符串(表达式)
  • 通过python的内置函数执行字符串表达式,即:将html文件的内容和嵌套的数据整合
  • 将数据返回给请求客户端

所以,如果要返回给客户端对于一个html文件来说,根据上述的5个阶段其内容的变化过程应该是这样:

123456789101112131415161718192021 class MainHandler(tornado.web.RequestHandler):    def get(self):        self.render(\”main.html\”,**{\’data\’:[\’11\’,\’22\’,\’33\’],\’title\’:\’main\’}) [main.html]<!DOCTYPE html><html><head lang=\”en\”>    <meta charset=\”UTF-8\”>    <title></title></head><body>    <h1>{{title}}</h1>     {% for item in data %}        <h3>{{item}}</h3>    {% end %}</body></html> XXXHandler.get

1234567891011121314 <!DOCTYPE html><html><head lang=\”en\”>    <meta charset=\”UTF-8\”>    <title></title></head><body>    <h1>{{title}}</h1>     {% for item in data %}        <h3>{{item}}</h3>    {% end %}</body></html>



12345678 1块:\'

\’第2块:\’title\’3块:\'

\\n\\n\’
4块:\’for item in data\’    4.1块:\’\\n

\’    4.2块:\’item\’    4.3块:\'

\\n\’
第五块:\'\’



123456789101112131415161718 \’def _execute():    _buffer = []    _buffer.append(\\\\\’<!DOCTYPE html>\\\\n<html>\\\\n<head lang=\”en\”>\\\\n<meta charset=\”UTF-8\”>\\\\n<title></title>\\\\n</head>\\\\n<body>\\\\n<h1>\\\\\’)    _tmp = title    if isinstance(_tmp, str): _buffer.append(_tmp)    elif isinstance(_tmp, unicode): _buffer.append(_tmp.encode(\\\\\’utf8\\\\\’))    else: _buffer.append(str(_tmp))    _buffer.append(\\\\\’</h1>\\\\n\\\\\’)    for item in data:        _buffer.append(\\\\\’\\\\n<h3>\\\\\’)        _tmp = item        if isinstance(_tmp, str): _buffer.append(_tmp)        elif isinstance(_tmp, unicode): _buffer.append(_tmp.encode(\\\\\’utf8\\\\\’))        else: _buffer.append(str(_tmp))        _buffer.append(\\\\\’</h3>\\\\n\\\\\’)    _buffer.append(\\\\\’\\\\n</body>\\\\n</html>\\\\\’)    return \\\\\’\\\\\’.join(_buffer)\’



12 a、参照本篇博文的前戏 http://www.cnblogs.com/wupeiqi/p/4592637.htmlb、全局变量有 title \’main\’;data = [\’11\’,\’22\’,\’33\’]

在第4步中,执行第3步生成的字符串表示的函数后得到的返回值就是要返回给客户端的响应信息主要内容。

3.13、RequestHandler的render方法

此段代码主要有三项任务:

  • 获取Html文件内容并把数据(程序数据或框架自带数据)嵌套在内容中的指定标签中(本篇主题)
  • 执行ui_modules,再次在html中插入内容,例:head,js文件、js内容、css文件、css内容和body
  • 内部调用客户端socket,将处理请求后的数据返回给请求客户端

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 class RequestHandler(object):     def render(self, template_name, **kwargs):        #根据Html文件名称获取文件内容并把参数kwargs嵌入到内容的指定标签内        html = self.render_string(template_name, **kwargs)         #执行ui_modules,再在html的内容中插入head,js文件、js内容、css文件、css内容和body信息。        js_embed = []        js_files = []        css_embed = []        css_files = []        html_heads = []        html_bodies = []        for module in getattr(self, \”_active_modules\”, {}).itervalues():            embed_part = module.embedded_javascript()            if embed_part: js_embed.append(_utf8(embed_part))            file_part = module.javascript_files()            if file_part:                if isinstance(file_part, basestring):                    js_files.append(file_part)                else:                    js_files.extend(file_part)            embed_part = module.embedded_css()            if embed_part: css_embed.append(_utf8(embed_part))            file_part = module.css_files()            if file_part:                if isinstance(file_part, basestring):                    css_files.append(file_part)                else:                    css_files.extend(file_part)            head_part = module.html_head()            if head_part: html_heads.append(_utf8(head_part))            body_part = module.html_body()            if body_part: html_bodies.append(

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...