tornado 04 模板
一、模板
#模板就是一个HTML文件,只是其中添加了模板语法,需要服务器的渲染才能正常显示数据
#通过render可以返回一个html网页,不过那都是固定的页面,固定的数据,如果数据是不确定的,是会不断改变的,该如何做? #先把页面写好,然后预留出固定的位置,在需要的时候再填入数据即可
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('template')
self.render('lesson2.html')
def post(self, *args, **kwargs): #在页面内动态地传入参数
name = self.get_body_argument('name','no')
# self.write(name)
self.render('lesson04_templates.html', #提交以后的页面应该跳转为这个页面,而不是仅仅输出一个name
username = name #提取body属性,将name赋值给username
)
#模板 #在tornado中,模板就是一个html文件,但是模板通过模板语法,由tornado服务渲染之后,可以动态地往页面填入数据 #tornado自带模板语法,不需要再用其他的模板插件
二、模板符号
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('template')
self.render('lesson2.html')
def post(self, *args, **kwargs): #在页面内动态地传入参数
name = self.get_body_argument('name','no')
urllist = [
('http://www.baidu.com','去百度'),
('http://www.shiguangkey.com','去时光'),
('http://www.zhihu.com','去知乎')
]
# self.write(name)
self.render('lesson04_templates.html', #提交以后的页面应该跳转为这个页面,而不是仅仅输出一个name
username = name ,#提取body属性,将name赋值给username
time = time,
urllist = urllist
)
<body>
#代表一个python表达式
hello {{ username }} #大括号可出输出变量的值
<br>
{{ 1+1 }} # 输出计算结果
<br>
{{ a = time.time() }} #输出执行方法(当前的时间戳),必须加括号,不然就是一个函数对象
<br>
#代表一个指令
{% if username != 'xuwei' %}
欢迎{{ username}} 登录
{% else %}}
请登录
{% end %} #使用if必须要用end结束,因为模板跟python一样不是以缩进来约束代码块
<br>
#代表一个注释
<!--{{ a = time.time() }}--> #在这里虽然被注释掉了,但是在页面运行的时候,页面不会显示,但是这个表达式还是运行了,只不过是在源代码会显示时间戳
<!--{#a = time.time() #}--> #这样才是注释,页面不会显示,源代码也不会
<br>
#代表输出源码。不执行,加个!即可
{{! 1+1 }} #这样可以向页面输出源码,不会输出运行结果
#for循环
{% for i in urllist %}
{{ i }}
<a href="{{ i[0] }}" target="_blank"> {{ i[1]}}</a>
{% end %}
# while循环
{% set a = 0 %} #在调用while是时候需要定义a,这就需要使用set
{% while a <5 %}
{{ a }}<br>
{% set a += 1 %}
{% end %}}
</body>
三、模板的转义
#如果给的是一个html文件,模板会不会解析
def post(self, *args, **kwargs):
name = self.get_body_argument('name','no')
urllist = [
('http://www.baidu.com','去百度'),
('http://www.shiguangkey.com','去时光'),
('http://www.zhihu.com','去知乎')
]
atga = """<a href="https://www.baidu.com" target="_blank"> _____走 去百度_____</a>""" #这是一个字符串
# self.write(name)
self.render('lesson04_templates.html',
username = name ,
time = time,
urllist = urllist,
atga = atga
)
application = tornado.web.Application(
handlers=[
(r'/tem',MainHandler),
],
template_path = 'templates',
autoescape = None, #在这里面加上这个也可以去除所有的转义 全局去转义
debug=True
)
<!DOCTYPE html>
{% autoescape None %} #对所有的内容都去除转义,不需要在下面再添加了,也可以在前民 模板级别去转义
<html lang="en">
<head>
<br>
{{ atga}} #这样会直接把源码显示在网页中,不解析 ;会将字符串里面的标签转化为其它的符号,进而也就不解析了,但是显示在也页面的时候又会解析成原来的标签(这便就是转义)
{% raw atga %} #加个一个raw 就可以解析(局部去除上面的转义)了 局部去转义
<br>
{{ escape(atga) }} #这样依然会转义
四、静态文件引用
#有时候需要返回一些图片,那么如何返回这些静态文件呢 #1、先导入图片,放到static/images/ 2、然后在application中设置好静态文件的路径 static_path='static' 3 、在html文件中用两种方法导入
application = tornado.web.Application(
handlers=[
(r'/tem',MainHandler),
],
template_path = 'templates',
static_path= 'static', #标准写法,设置静态文件的路径
autoescape = None,
debug=True
)
{% if username != 'no' %}
欢迎{{ username}} 登录
<img src="{{ static_url('images/1.jpg')}}" width="250" height="250"> #这两者的区别在于url不同,再次请求是,这个路径会直接在缓存中找图片,不用重新下载,效率更高一点
#使用此方法时,tornado会自动给静态文件添加版本号,如果版本号更改了,浏览器会自动地缓存新的文件
<img src="static/images/1.jpg" width="250" height="250">
#在tornado模块中,static是个关键字,能够自动替换成static_path后的内容
{% end %}
</body>


浙公网安备 33010602011771号