1. 什么是 Tornado 模板
Tornado 是一个 Python 的 Web 框架,它强调的是异步非阻塞式处理方式,具有高并发的能力,适用于一些网站的场景,如实时 Web 系统等。
Tornado 还提供了一套模板系统,在模板中可以将数据填充到 HTML 页面中,从而生成最终的响应。使用模板可以方便地处理前端与后端的交互。
2. Tornado 模板的使用
2.1 模板的基本用法
Tornado 的模板使用和 Django、Flask 等 Web 框架的模板很类似。下面是一个简单的例子:
import tornado.ioloop
import tornado.web
import os
class MainHandler(tornado.web.RequestHandler):
def get(self):
items = ["Apple", "Orange", "Banana"]
self.render("templates/index.html", title="Welcome to Tornado", items=items)
if __name__ == "__main__":
app = tornado.web.Application([
(r"/", MainHandler),
],
template_path=os.path.join(os.path.dirname(__file__), "templates"))
app.listen(8080)
tornado.ioloop.IOLoop.current().start()
在上面的例子中,我们定义了一个 Web 应用并为其注册了一个路由。当用户访问根路径时,会执行 MainHandler 中的 get 方法。在这个方法中,我们定义了一个列表 items 并将它和一个字符串 "Welcome to Tornado" 一起传递给了 render 方法。
在模板文件 templates/index.html 中,我们可以通过 {{ }} 语法来引用这些变量,如下所示:
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% end %}
</ul>
</body>
</html>
2.2 模板语法详解
Tornado 的模板语法与 Django 的模板语法非常相似。下面我们简单介绍一下 Tornado 模板的语法。
2.2.1 基本语法
Tornado 的模板中,我们可以通过 {{ }} 来引用变量。比如:
<h1>{{ title }}</h1>
这段代码将会把变量 title 的值填充到 HTML 页面中。
另外,在 Tornado 的模板中,我们也可以使用 {% %} 来执行某些语句,比如 for 循环、if 判断等,如下面的例子所示:
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% end %}
</ul>
这段代码会循环遍历 items 列表,把每个元素都填充到 HTML 页面中。
2.2.2 过滤器
在 Tornado 的模板中,我们还可以使用过滤器来格式化数据。比如,我们可以使用 datetime 过滤器来格式化日期:
<p>{{ date | datetime("%Y-%m-%d") }}</p>
这段代码会把 date 变量转换成字符串,并按照 "%Y-%m-%d" 的格式输出。
2.3 模板继承
Tornado 的模板还支持继承和块标记。我们可以在一个模板中定义一些块,然后在其他模板中通过继承这个模板来重载这些块。下面是一个简单的例子:
父模板 base.html:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% end %}</title>
</head>
<body>
{% block content %}{% end %}
</body>
</html>
子模板 index.html:
{% extends "base.html" %}
{% block title %}Welcome to Tornado{% end %}
{% block content %}
<h1>Hello, Tornado!</h1>
{% end %}
这个例子中,我们定义了一个名为 base.html 的父模板,并在其中定义了两个块:title 和 content。接下来,我们定义了一个名为 index.html 的子模板,并通过 {% extends "base.html" %} 语句来继承了父模板。在子模板中,我们通过 {% block title %} 和 {% block content %} 语句来重载了父模板中的对应块。