tornado 中的模板使用
import random
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, parse_config_file, options
from tornado.web import Application, RequestHandler, UIModule
define('port', type=int, default=8888, multiple=False)
parse_config_file('config')
class IndexHandler(RequestHandler):
def get(self, *args, **kwargs):
self.render('login.html')
class NewHandler(RequestHandler):
def post(self, *args, **kwargs):
uname = self.get_arguments('uname')[0]
upwd = self.get_arguments('upwd')[0]
if uname == 'abc' and upwd == '123':
self.render('news.html')
else:
self.redirect('/?msg=false')
class LoginModule(UIModule):
''' 创建自定义的模块类 '''
def render(self, *args, **kwargs):
msg = ''
if self.request.query:
msg = '用户名或密码错误'
return self.render_string('module/module_login.html', result=msg)
class NewModule(UIModule):
''' 创建自定义的模块类 '''
def myrand(self, a, b):
return random.randint(a, b)
def render(self, *args, **kwargs):
return self.render_string('module/module_news.html',
num1=100,
num2=200,
myrand=self.myrand,
new_list=[{'title': '新闻第一线',
'tag': ['新闻', '新型冠状病毒'],
'contents': '新闻全部内容',
'img': '0.jpg'},
{'title': '新闻时刻',
'tag': ['新闻', '科比逝世'],
'contents': '新闻全部内容',
'img': '1.jpg'},
]
)
url_list = [('/', IndexHandler),
('/new', NewHandler)]
app = Application(url_list,
template_path='F:/mytornado/tornado_model/mytemplates',
static_path='F:/mytornado/tornado_model/mytemplates/mystatic',
ui_modules={'login_module':LoginModule, 'new_module': NewModule})
server = HTTPServer(app)
server.listen(options.port)
IOLoop.current().start()
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% end %}title>
{% block head %} {% end %}
head>
<body>
{% block body %} {% end %}
body>
html>
{% extends base.html %}
{% block title %} 登录 {% end %}
{% block head %} <script src="{{ static_url('js/jquery-2.1.1.js') }}">script> {% end %}
{% block body %}
{% module login_module()%}
{% end %}
<form method="post" action="/new">
<p>
用户名:<input type="text" name="uname">
p>
<p>
密码:<input type="password" name="upwd">
p>
<p>
<input type="submit" value="登陆">
p>
form>
<p>{{ result }}p>
{% extends base.html %}
{% block title%} News {% end %}
{% block body %}
{% module new_module() %}
{% end %}
{% for new in new_list %}
<table border="1px" cellpadding="5px" width="100%">
<tr><td rowspan="4" align="center" width="100px">
<table>
<tr><td><img width="128px"
hight="128px"
src="{{static_url('images/'+new['img'])}}"
align="center">td>tr>
<tr><td align="center"><p style="width: 100px;
border: 1px solid yellowgreen;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis">python小子p>td>tr>
table>td>
<td>{{ new['title'] }}td>
tr>
<tr><td>{{ ' '.join(new['tag']) }}td>tr>
<tr><td style="min-height: 150px; display: block">{{ new['contents'] }}td>tr>
<tr><td align="right">点赞数:{{ num1 }};
评论数:{{ num2 }};
阅读数:{{ num1 + num2 }};
转发数:{{ myrand(50,100) }}td>tr>
table>
{% end %}
- 函数:
- app = Application(url_list, template_path=’…’, static_path=’…’, ui_modules={})
- 参数url_list:路由列表,列表的每个元素为一个元组,如(’/’, IndexHandler)
- 参数template_path:指定模板所在的文件夹
- 参数static_path:指定静态资源所在的文件夹
- 参数ui_modules:参数值为一个字典,键为页面中要加在的模块名,值为一个自定义的类名
- self.render(‘index.html’, name1, name2…)
- 参数 ‘index.html’:模板名称
- name1, name2… :需要向模板中传递的参数,键名为name1,name2…
- 模板获取参数值:
- 在html文件中采用{{ }}获取
- {{ name1 }} {{ name2 }} 获取一般参数值
- {{ obj[‘name1’] }} {{ obj[‘name2’] }} 获取字段参数值
- {{ function(name1,name2) }} 获取函数的返回值
- 页面中加载静态资源
- {{ static_url( str ) }} 加载静态资源
- 参数str:静态资源的路径
- 例如:{{ static_url(‘js/jquery-2.1.1.js’) }} 加载jQuery 文件
- {{ static_url( ‘images/’ + new[ ‘img’ ] ) }} 加载静态资源图片
- 模板中加载模块
- {% extends ***.html %} 继承自某个页面
- {% block name %} {% end %} 被替换的内容
- {% block name %} contents {% end %} 用contents替换被继承的模板页面
- {% module login_module()%} 加载模块,login_module是后台Application函数的ui_module参数中键名
- 说明
- 1、输入用户名和密码不正确时,返回首页带msg参数,判断msg参数有值,提示 用户名密码错误
- 2、在模板中使用if 或 for语句时,需要写{% end %},不需要写{% endif %} 或者{% endfor %}
- 3、可以在模板中直接使用python的内置函数和自定义的函数
- 4、‘ ’.join(list):可以直接分割列表内的元素