在 Tornado 中,模板引擎用于渲染用户界面,生成动态的 HTML 内容。Tornado 默认支持的模板引擎是基于 Python 的 [Jinja2](https://jinja.palletsprojects.com/),但也支持其他模板引擎,如 [Mako](https://www.makotemplates.org/)。在下面的示例中,我将演示如何在 Tornado 中使用 Jinja2 模板引擎。

安装 Jinja2

首先,确保安装了 Jinja2。可以使用以下命令进行安装:
pip install jinja2

Tornado 中使用 Jinja2 模板引擎

以下是一个简单的 Tornado 应用程序,演示了如何使用 Jinja2 模板引擎渲染用户界面。
import tornado.ioloop
import tornado.web
from tornado.options import define, options
from tornado.web import RequestHandler, Application

from jinja2 import Environment, FileSystemLoader

define("port", default=8888, help="run on the given port", type=int)

class BaseHandler(RequestHandler):
    def initialize(self):
        # 初始化 Jinja2 模板引擎
        self.env = Environment(loader=FileSystemLoader("templates"))

    def render_template(self, template_name, **kwargs):
        template = self.env.get_template(template_name)
        content = template.render(kwargs)
        self.write(content)

class MainHandler(BaseHandler):
    def get(self):
        # 在主处理器中渲染模板
        self.render_template("index.html", title="Tornado Jinja2 Demo")

def make_app():
    return Application([
        (r"/", MainHandler),
    ], **settings)

if __name__ == "__main__":
    app = make_app()
    app.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

模板文件示例

在项目根目录下创建一个名为 templates 的文件夹,并在其中放置 Jinja2 模板文件。例如,创建一个 index.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>Welcome to Tornado with Jinja2!</p>
</body>
</html>

在模板文件中,可以使用双花括号 {{ ... }} 插入变量,这些变量将在渲染时由 Tornado 提供的数据填充。

注意事项

  •  在 BaseHandler 类中初始化了 Jinja2 模板引擎,并定义了 render_template 方法用于渲染模板。所有的处理器类可以继承 BaseHandler,并通过 self.render_template 方法渲染模板。


  •  在模板中使用 {{ ... }} 插入变量,使用 {% ... %} 包裹控制结构,如循环和条件语句。


  •  模板文件应该存放在一个特定的目录中,上述示例使用了名为 templates 的目录。


通过这种方式,你可以在 Tornado 中使用模板引擎渲染动态的用户界面。根据具体项目的需求,你可以选择使用不同的模板引擎,但使用 Jinja2 是一种常见的选择。


转载请注明出处:http://www.pingtaimeng.com/article/detail/7421/Tornado