外观
模板
Tornado的模板存放在tornado.template模块中,使用模板可以简化Web开发。
渲染模板
使用模板时,需要先在应用中设置template_path路径,然后使用render()函数渲染模板。
首先先创建一个main.py文件。
import os.path
import tornado.ioloop
import tornado.web
class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.render('login.html') # 渲染模板文件
def post(self):
username = self.get_argument('username')
password = self.get_argument('password')
self.write(f'用户名:{username},密码:{password}')
def make_app():
return tornado.web.Application(handlers=[
('/login', LoginHandler)
], template_path=os.path.join(os.path.dirname(__file__), 'templates')) # 创建模板
if __name__ == '__main__':
app = make_app()
app.listen(8888)
print('开始监听8888端口')
tornado.ioloop.IOLoop.current().start()然后在main.py同级目录下创建一个templates文件夹,在里面创建login.html文件,代码如下。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="/login" method="post">
<label for="username">用户名:</label><input type="text" name="username" id="username">
<label for="password">密码:</label><input type="password" name="password" id="password">
<input type="submit" value="登录">
</form>
</body>
</html>然后运行main.py,现在浏览器访问127.0.0.1:8888/login,看到如下的页面。

然后输入用户名和密码之后点击登录,出现如下图的提示。

模板语法
Tornado支持在HTML中嵌入控制语句和表达式。控制语句的格式与Jinja2的语法类似,需要包含在“{%”和“%}”之间,例如“{% if bool %}”。表达式则要包含在{{与}}之间,如{{ item[0] }}。控制语句和Python的语句类似,支持if、for、while、try,且需要用“{% end %}”结束,如下。
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<ul>
{% for item in list %}
<li>{{ item }}</li>
{% end %}
</ul>
</body>
</html>提供静态文件
当编写网页时,用到js和css等静态文件时,可以使用Tornado提供的一种简便的使用方式引用静态资源。
第一步就是在Application的构造函数中传递一个叫做static_path的关键字参数,它用于引用所有静态文件的根目录。第二步就是在HTML模板中使用Tornado提供的static_path函数生成静态文件的URL。具体请看下面的例子。
首先创建一个main.py文件。
import os.path
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render('login.html')
def post(self):
username = self.get_argument('username')
password = self.get_argument('password')
self.write(f'用户名:{username},密码:{password}')
def make_app():
return tornado.web.Application(handlers=[
('/login', MainHandler)
],
static_path=os.path.join(os.path.dirname(__file__), "static"),
template_path=os.path.join(os.path.dirname(__file__), 'templates'))
if __name__ == '__main__':
app = make_app()
app.listen(8888)
print('开始监听8888端口')
tornado.ioloop.IOLoop.current().start()然后创建模板文件,代码如下。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<link rel="stylesheet" href="{{ static_url('style.css')}}">‘
<script src="{{ static_url('main.js')}}"></script>
</head>
<body>
<form action="/login" method="post">
<label for="username">用户名:</label><input type="text" name="username" id="username">
<label for="password">密码:</label><input type="password" name="password" id="password">
<input type="submit" value="登录">
</form>
</body>
</html>其中引用样式表的那行,使用了Tornado内置框架的static_url函数,然后参数就是文件名或者路径名。
这个style.css位于和main.py同级目录下的static文件夹内。