template中的_parse方法是模板文法的解析器,而这个文件中一坨一坨的各种node以及block,就是解析结果的承载者,也就是说在经过parse处理过后,我们输入的tornado的html模板就变成了各种block的集合。
这些block和node的祖宗就是这个“抽象”类, _Node,它定义了三个方法定义,其中generate方法是必须由子类提供实现的(所以我叫它“抽象”类)。
理论上来说,当一个类成为祖宗类时,必定意味着这个类包含了一些在子类中通用的行为,那么,从_Node暴露出来的方法来看,即所有的子类理论上都会有如下特征:
1. 可作为容器 (each_child, find_named_blocks)
2. generate
当然了,理想总是丰满的,现实也总有那么点儿不对劲,对于某些子孙,它们的特征看上去不是那么靠谱,比如_Text。
_Text这个类只用到了generate这个方法,用于将文字(Html, JS)经过trim后添加到输入流中,如果调用它的each_child or find_named_blocks,当然你能这么做,但是没有什么意义。
前面反复说到_Parse方法,它返回的结果是一个_ChunkList的实例,而_ChunkList继承与_Node。这是一个体现了_Node容器特点的类,重写了generate方法和each_child方法,而基本上就是依次调用容器内所有元素的相关方法而已。
_Nodes众多子子孙孙中比较奇葩的是_ExtendsBlock这个类,丫什么事情都没做(That is true),看上去像是另外一个“抽象类”,但是居然会被_Parse初始化,用于处理Extends这个token(tornado术语)。我就纳闷了,一旦这货被generate,难道不会抛一个异常出来木?
真正有意思的是另外几个方法,它们有共通的模式,用_ApplyBlock来举例
在_ApplyBlock中,有趣的是generate方法
def generate(self, writer): method_name = "apply%d" % writer.apply_counter writer.apply_counter += 1 writer.write_line("def %s():" % method_name, self.line) with writer.indent(): writer.write_line("_buffer = []", self.line) writer.write_line("_append = _buffer.append", self.line) self.body.generate(writer) writer.write_line("return _utf8('').join(_buffer)", self.line) writer.write_line("_append(%s(%s()))" % ( self.method, method_name), self.line)简单来说,这个函数做了两件事情:
- 定义了一个python文件全局函数叫做applyXXX():,其中的XXX是一个整形的,自增的值,返回值是一个utf8字符串。
- 执行这个applyXXX函数,将此函数的输出再作为self.method这个函数的输入。
所以,如果一个类似于这样的模板
{%apply linkify%} {{address}} {%end%}
会得到一个类似于如下的输出:
r = applyXXX() r = linkify(r) _append(r)
结合这篇文章 http://autumn-sea.appspot.com/page/agphdXR1bW4tc2VhcgwLEgRCbG9nGLKDfww (需科学上网),可以了解到,tornado的template机制,本质上讲,就是允许开发者已HTML + template marker的方式来编写视图模板,但是在背后,tornado会把这些视图模板通过template的处理,变成可编译的python代码。
还是那autumn-sea上面的代码作为例子,比较容易理解。
View Template
<html> <head> <title>{{ title }}</title> </head> <body> hello! {{ name }} </body> </html>
处理后
_buffer = [] _buffer.append('<html>\\n<head>\\n<title>') _tmp = title if isinstance(_tmp, str): _buffer.append(_tmp) elif isinstance(_tmp, unicode): _buffer.append(_tmp.encode('utf-8')) else: _buffer.append(str(_tmp)) _buffer.append('</title>\\n</head>\\n<body>\\n') _buffer.append('hello! ') _tmp = name if isinstance(_tmp, str): _buffer.append(_tmp) elif isinstance(_tmp, unicode): _buffer.append(_tmp.encode('utf-8')) else: _buffer.append(str(_tmp)) _buffer.append('\\n</body>\\n</html>\\n') return ''.join(_buffer)\n"
简单吧?听说这就是传说中的CGI,不过咱没弄过。。。
相关推荐
Tornado,访问:http://www.tornadoweb.org/en/stable/ Flask,访问:http://flask.pocoo.org/ Web.py,访问:http://webpy.org/ Tools xlrd,Excel处理利器,访问:http://www.python-excel.org/ lxml,XML处理,...
龙卷风 :tornado: :horse: 用于异步编程的库。 龙卷风由几个接口组成,可以使用编写异步程序。 该库提供了适用于流行的异步框架( , )的适配器和内置适配器,以了解如何编写自己的适配器。安装您可以使用安装它:...
基于Tornado的开源CMS系统,TorCMS 是使用Python 3.5,Tornado Web框架, Peewee 开发的,数据库使用 PostgreSQL 9.4以上版本。使用MIT协议发布,目的是为了学习与交流,欢迎大家多提意见。 案例: ...
图形风暴 GraphQl Web IDE。 产品特点 :floppy_disk: 导出/导入工作区 :sparkles: 自动补全和错误突出显示 :books: 互动式多栏位文件 :gear: 多个标签和端点 用法 <!--index.html-->... 或通过np
Python 2.7,离线安装 合集 tornado-4.4.2,python2-backports_abc-0.5-2,python-backports-ssl_match_hostname-3.5...sudo cp -r /home/sukai/python-pkg/tornado/lib64/python2.7/site-packages/tornado-4.4.2-py2.7
@keyframes tornado { 0% { transform: rotate(0deg) scale(1); } 50% { transform: rotate(180deg) scale(1.2); } 100% { transform: rotate(360deg) scale(1); } } ``` 接下来,我们需要一个HTML结构来...
教程:使用Tornado构建,测试和分析高效的微服务 0.获取源代码 获取该教程的源代码: $ git clone https://github.com/scgupta/tutorial-python-microservice-tornado.git $ cd tutorial-python-microservice-...
[Tornado.2.2.1_VxWorks.5.5.1.for.PowerPC].TORNADO.2.2.1.FOR.POWERPC.CD1(ED2000.COM)
a demo of leancloud which use tornado framework # 本地运行环境 Windows、Linux 或 MacOS 操作系统 本地部署 下载源码 git clone https://github.com/stableShip/leancloud_tornado.git 修改leancloud配置信息 vi...
python ./friends_tornado/app.py 用法 默认情况下,服务器侦听端口 8088。JSON 用作序列化协议。 应用程序接口 行动 请求网址 请求方法 请求正文 响应状态码 响应体 找回朋友 /用户/[UID]/朋友 得到 200 成功; 如果...
Tornado 2.2 for ARM广泛应用于各种嵌入式系统的开发中,尤其是那些对实时性要求较高的领域,如航空航天、汽车电子、工业自动化等。例如,在设计一款用于无人机控制的嵌入式系统时,开发人员可以利用Tornado 2.2 for...
在本文中,我们将深入探讨"Tornado实战之一"这一主题,主要关注Python编程语言中的Tornado框架。Tornado是一个强大的、异步网络库,它最初由FriendFeed开发,后来被Facebook收购并开源。Tornado以其高并发、低延迟的...
command=/usr/bin/python /path/to/your/tornado/app.py directory=/path/to/your/app autostart=true autorestart=true user=youruser redirect_stderr=true stdout_logfile=/var/log/tornado.log ``` 最后,通过...
设置安装服务器依赖: $yum install git openssl mysql-server python python-pip MySQL-python tornado$pip install db-migrate创建分析用户: $useradd --user-group --shell /sbin/nologin --comment "analytics ...
用于使用简单和简约的API创建企业级(Web)应用程序的TypeScript框架,使您可以专注于业务逻辑。 根据声明和必要的程序,由inspiried /。 查看以获取更多详细信息。 Odi提供了用于创建易于支持和可扩展的Web应用...
node-express:一个 node.js express 应用程序 redis-test : 一个 redis 键/值服务器 python-tornado : Python 龙卷风网络服务器 每次运行都会runtest.bash设置内核ftrace工具、运行容器、打开相关pids 的跟踪、提供...
9. **开发工具**:配合Tornado开发环境,提供集成开发、调试、编译、链接等功能,简化开发流程。 10. **安全特性**:符合DO-178B航空电子软件标准,支持安全认证。 Tornado开发环境是专门用于VxWorks的集成开发环境...
4. 模板系统:tornado.template模块提供了灵活的模板输出功能。 5. 网络工具:tornado.ioloop、tornado.iostream、***util等模块提供了丰富的网络编程工具。 6. HTTP服务器和客户端:tornado.httpserver和tornado....
Python Tornado是一个强大的异步网络库,用于构建高性能、高并发的Web服务。Tornado以其非阻塞I/O和事件驱动的模型而闻名,尤其适合实时Web应用,如聊天、实时图表或者推送通知等。在Eclipse + PyDev环境下开发...
django-龙卷风如何在 Tornado 上运行 Django 的示例。 只需运行run_tornado.py并导航到您的浏览器 或者 分别查看来自 Django 和 Tornado 的 HTTP 响应。设置您无需更改任何内容即可使用您自己的 Django 项目运行它,...