tornado模板与Django的模板差不多!
在tornado中,模板就是一个html文件,但是模板通过模板语法,由tornado服务渲染之后,可以动态的往页面中填入数据。
作用:可以先把页面写好,然后预留出固定的位置,在需要的时候再填入数据,最后通过tornado服务把这个数据渲染出来。
一、tornado中的配置
在 application 中配置:
(一).模板文件的路径
template_path='templates'
(二).静态文件的路径
static_path='static'
添加此配置之后,tornado就能自己找到静态文件
(三).静态文件两种引入方式
(1).写死 static/images/c.jpg
<img src="static/images/c.jpg">
在 Tornado 模板中,static是个关键词,能够自动替换成static_path后的内容。
(2).添加版本号 static_url("images/xx.jpg")
<img src="{{ static_url('images/c.jpg') }}">
使用此方法时,Tornado会自动地给静态文件添加版本号,如果版本号更改了,浏览器会自动的缓存新的静态文件。
二、两种表现形式
(一).模板变量{{ variable_name }}
例1:

<body>
欢迎{{ username }}登录
</body>
它也可以是python表达式
例2:

{{ 1 + 1 }}
{{ time.time() }}
(二).模板命令{%%}
其实就是,大括号百分号所包裹的python语法
例1:

{% if 1 %} this is if {% end %}
注意:tornado的模板语法的结束标识是{% end %},不是Django或jinja2的{% endblock %}
(三).常用的模板符号
(1).{# … #} 在模板中要注释python表达式的运行。如:{# time.time() #}}
(2).{{! {%! {#! 如果不想执行内容,需要在页面上打印出模板符号,只需要加上感叹号(!)即可。如下例:

{{! 1 + 1}} {%! if 1 %} this is if {%! end %} {#! time.time() #}}
(3).if判断

{% if username != 'no' %} 欢迎{{ username }}登录 {% else %} 请登录 {% end %}
(4).for循环

{% for i in urllist %} {{ i }} {% end %}
(5).while循环

{% set a = 0 %} {% while a<5 %} {{ a }}<br> {% set a += 1 %} {% end %}
三、模板转义
通过模板,可以把数据动态的添加到页面。如果添加的值是一段html代码的话,并不会去解析,只是当作一个字符串,直接在页面上打印出来。
tornado默认是自动的转义,传入的数据都会当作字符串,不会被浏览器解析。
(一).模板去掉转义
(1).局部去掉转义{% raw variable_name %}
{% raw %}去掉转义,让 tornado 在渲染的时候不去转义变量。
“局部”顾名思义,只对当前这个变量有效。
(2).当前整个模板去转义{% autoescape None %}
在模板最上面({% extends %}后面)添加:{% autoescape None %},固定写法!当前模板不再转义。
(3).整个项目去掉转义
在 application 中添加如下配置:autoescape=None
去掉整个项目的转义,配置之后,整个项目中的模板不再转义。
四、模板继承与引入
tornado的模板继承与Django几乎一样。个人观察来看,唯一的区别的也只是关闭标签:在tornado是{% end %},在Django中是{% endblock %}
(一).extend
{% extends "base.html" %}继承模板,在子模板中会把父模板的所有内容都继承到子模板中,减少大量重复代码
(二).block
子模板中需要修改的区域,事先先在父模板中预留出来。子模板中直接使用已预留出来的接口。
无论预留还是使用,都是使用:{% block *name* %}...{% end %}
(三).模板引入
{% include ./05include.html %}
include可以导入一些其他的模板文件,一般使用include的时候,被引入的模板文件中不使用block块。
五、ui_methods
(一).新建文件ui_methods.py
文件名随意给,只要在import时合法即可。这里可以新建一个文件夹,如util,来放置 ui_methods.py 和 ui_modules.py

def methods1(self): # 注意这里要加上self return 'ui_methods 1' def methods2(self): return 'ui_methods 2'
注意:小括号里必须要加上self
(二).在项目中导入
import util.ui_methods
(三).配置 Application 参数
ui_methods=util.ui_methods,
(四).在模板中调用
{{ methods1() }}
六、ui_modules
(一).新建文件ui_modules.py
使用ui_modules需要继承UIModule类,注意:必须继承UIModule类

from tornado.web import UIModule class UiModule(UIModule): def render(self, *args, **kwargs): return '我是 ui_module'
(二).在项目中导入
import util.ui_modules
(三).配置 Application 参数
(1).ui_modules=util.ui_modules
(2).也可以写成字典形式:ui_modules={'UiModule':util.ui_modules.UiModule,}
(四).在模板中调用
{% module UiModule() %}
(五).在页面中放置广告案例
(1).目录结构
(2).ui_modules.py代码

from tornado.web import UIModule class ShowAdCloths(UIModule): def render(self, *args, **kwargs): return self.render_string("06ad.html") def css_files(self): return "/static/css/King_Chance_Layer7.css" def javascript_files(self): return [ "/static/js/bootstrap.min.js", "/static/js/jquery.backstretch.min.js", "/static/js/jquery-2.2.0.min.js", "/static/js/jquery_1_7.js", "/static/js/King_Chance_Layer.js", "/static/js/King_layer_test.js", ]
必须重写那三个方法,不然没有任何效果
(3).06ad.html代码

<div class="King_Chance_Layer"> <div class="King_Chance_LayerCont" style="display:none;"> <div class="King_Chance_Layer_Close">Close</div> <div class="King_Chance_Layer_Title">SHOPBEST 商城SHOPBEST 商城SHOPBEST 商城SHOPBEST 商城</div> <div class="King_Chance_Layer_Btn"> <ul> <li><a href="#" title="百搭潮">百搭潮</a></li> <li><a href="#" title="抗皱棉">抗皱棉</a></li> <li><a href="#" title="植绒">植绒</a></li> <li><a href="#" title="潮范">潮范</a></li> </ul> </div> <div class="King_Chance_Layer_Content"> <ul> <li><a href="#" title="百搭潮"><img src="/static/images/King_imgs/ipush1.jpg" alt="百搭潮"></a></li> <li><a href="#" title="抗皱棉"><img src="/static/images/King_imgs/ipush2.jpg" alt="抗皱棉"></a></li> <li><a href="#" title="植绒"><img src="/static/images/King_imgs/ipush3.jpg" alt="植绒"></a></li> <li><a href="#" title="潮范"><img src="/static/images/King_imgs/ipush4.jpg" alt="潮范"></a></li> </ul> </div> </div> </div>
(4).index.html代码

{% extends ./base.html %} {% block title %} 06 模板继承和导入 {% end %} {% block content %} {{ to_upper("quanquan616") }} <br> this is index content, not base.html <br> {% include ./include_example.html %} <br> {% module ShowAdCloths() %} {% end %}
(5).最终运行效果
七、模板其他命令
(一).apply
使函数的作用范围到最近的{%end%}为止

{% apply upper %} hello world<br> hahaha {% end %} <br> {{ upper('hahaha') }}
(二).linkify
linkify生成一个链接,但是要注意模板转义
{% raw linkify('百度: http://www.baidu.com') %}