tornado七:模板
1.配置模块路径:
# config.py settings = { "template_path": os.path.join(BaseException, "templates") }
2.渲染并返回给客户端
使用self.render(模板文件)方法
示例:
# tmpl1.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 这是tmpl1页面 </body> </html>
# application.py ('/template1', index.TMPLHandler) # index.py class TMPLHandler(RequestHandler): def get(self, *args, **kwargs): self.render('tmpl1.html')
3.语法与表达式
语法:同django的模板语法基本上一样。{{ var }} ,{{ express }}。
django中模板的变量,从视图函数中传递;tornaod中模板的变量,从视图函数中传递。
方式一,传变量:
class TMPLHandler(RequestHandler): def get(self, *args, **kwargs): temp = 100 # num是模板中的变量名;temp是Handler中的变量 self.render('tmpl1.html', num=temp) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>这是tmpl1页面</h1> <h1>数量: {{ num }}</h1> <h1>数量+10: {{ num + 10 }}</h1> </body> </html>
方式二,传对象:
传对象也有两种方式,通常使用下面的第一种方式。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>这是tmpl1页面</h1> <!--在tornado模板中,对象不能使用点语法--> <!--传对象方式一:--> <h1>{{ per["name"]}}</h1> <!--传对象二:--> <!--<h1> {{ name }}</h1>--> <!--<h1> {{ age }}</h1>--> </body> </html>
class TMPLHandler(RequestHandler): def get(self, *args, **kwargs): temp = 100 per = { "name": "haha", "age": 23, } self.render('tmpl1.html', num=temp, per=per) self.render('tmpl1.html', num=temp, **per)
4.流程控制
if :
格式:在django模板中,以endif结尾。在tornado中,全部以end结尾。
if格式一:
{% if 表达式 % }
语句
{% end %}
if格式二:
{% if 表达式 % }
语句
{% else %}
语句
{% end %}
if格式三:
{% if 表达式 % }
语句1
{% elif %}
语句2
....
{% end %}
示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>这是tmpl1页面</h1> {% if flag == 0 %} <h1>flas is 0</h1> {% else %} <h1>flas is other</h1> {% end %} </body> </html>
for :
格式:django中,以endfor结尾;tornado中以end结尾。
{% for 变量 in 集合 %}
语句
{% end %}
示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for stu in stus %} <li>{{ stu["name"] }}</li> {% end %} </ul> </body> </html>
class TMPLHandler(RequestHandler):
def get(self, *args, **kwargs):
stus = [
{
"name": "jerry",
"age": 22
},
{
"name": "jason",
"age": 21
}
]
self.render('tmpl1.html',stus=stus)
while:比较少用,略。
5.添加css等静态文件
配置:
#config.py settings = { "static_path": os.path.join(BASE_DIRS, "static"), }
创建目录:在项目根下,创建static目录;在static目录下,创建css、img、js目录
创建css文件:
# tmpl1.css h1 { color: red; }
创建模板,并在模板中引入css文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--这里,要注意,同django不一样的,要多加一层static目录。同tornado的模板也不一样,模板也不需要多加一层templates--> <link rel="stylesheet" href="static/css/tmpl1.css"> </head> <body> <ul> {% for stu in stus %} <li>{{ stu["name"] }}</li> {% end %} </ul> </body> </html>
创建路由和视图函数Handler:这个应该最先创建,这里使用上面例子中的。
6.函数
1.static_url():获取配置中的静态目录,并将参数拼接到静态目录后,返回新的路径。
优点:1).修改静态文件最上层目录时,不需要修改url。
2).它创建了一个基于文件内容的hash值,并将其添加到url末属(当一个查询参数),这个hash值总能保证加载的都是最新的文件,而不是以前缓存的旧版本。
原理:服务器上对此文件(url)会产生一个hash值,并同步到客户端。
当客户端再次请求此url时,将缓存中的此url的hash值作为查询参数,与服务器上的此url作对较;
如果hash值不变,则使用缓存;
一旦服务器上此文件发生变化,服务器上会产生一个新的hash值,那么比较hash值的结果将不一样,将请求新的此url文件。
static_url,将完成此比较。
<head> <meta charset="UTF-8"> <title>Title</title> <!--这里,要注意,同django不一样的,要多加一层static目录--> <!--<link rel="stylesheet" href="static/css/tmpl1.css">--> <!--static_url的作用:拼接settings中static_path中的路径,和参数中的路径。如果static_path中的路径发生变化,就可以不影响链连--> <link rel="stylesheet" href="{{ static_url('css/tmpl1.css') }}"> </head>
2.自定义函数
自定义函数,不能在模板中定义,要在Handler中定义或在Handler中引用。
在Handler中传递给模板,在模板中使用。
# 路由application.py # 函数 (r'/func', index.FuncHandler) # Handler,index.py class FuncHandler(RequestHandler): def get(self, *args, **kwargs): def mySun(x, y): return x + y self.render('tmpl1.html', mysum=mySun) # 模板,tpml1.html <h1>{{ mySum(3, 5) }}</h1>
django中的模板,也可以调用方法,是对象的方法,不可以传参;
tornado中的模板,也可以调用方法,可以是对象的方法,也可以单独调用方法+传参。
7.转义
tornado默认开启了自动转义功能,能防止网站受到恶意攻击。
# 转义 (r'/trans', index.TransHandler),
class TransHandler(RequestHandler): def get(self, *args, **kwargs): str = "<h1>asdfsadfasf</h1>" self.render('trans.html', str=str)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ str }} </body> </html>
页面将显示:<h1>asdfsadfasf</h1>
因为tornado默认开启了转义,将标签转成字符串。
取消转义:
1.raw,只能关闭一行的转义。
<body>
{{ raw str }}
</body>
页面将显示:asdfsadfasf
2.{% autoescape None %},将关闭当前文档的转义,即当前页面。
<body> {{ str }} {{ str }} {% autoescape None %} {{ str }} </body>
3.在配置中取消转义,将关闭当前项目中的转义。一般不会将整个项目的转义都取消,安全将受到很大威胁。
settings = { "autoescape": None, }
<body>
{{ str }}
</body>
4.escape函数,局部取消转义。
作用:在关闭自动转义的环境中,单独开启某个变量的转义。
如当前文档关闭转义,在某个单独的变量开启转义。
<body> {{ str }} {{ str }} {% autoescape None %} {{ str }} {{ escape(str) }} </body>
8.继承
继承使用{% extends 继承的文件 %},同django一样。除了结尾部分,tornado所有的结尾统一使用{% end %};django中的结尾为{% end 对应的字段 %}
# base.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> </head> <body> {% block main %} {% end %} </body> </html>
示例:购物车的继承上面的页面
{% extends 'base.html' %}
{% block main %}
<h1>这里是购物车页面</h1>
{% end %}
9.静态文件
1). static_path
作用:告诉tornado从文件系统中的某一个特定的位置提供静态文件
示例:
# 配置文件config.py settings = { "static_path": os.path.join(BASE_DIRS, "static"),}
静态的html文件和模板的区别:静态的html文件,通常是没有变化的页面。静态的html文件,不需要路由也可以访问,直接访问目录/文件名也可以;访问服务器下面的某个资源,直接请求静态资源。
如:http://127.0.0.1:80/static/html/index.html
# 创建静态文件 static/html/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>这是静态页面</h1> </body> </html>
请求方式:http://127.0.0.1:80/static/html/index.html
引入其它文件:
<link rel="stylesheet" href="{{static_url('css/home.css'))}}"> <script type="text/javascript" charset="utf-8" src="{{static_url('js/jquery.js'))}}"></script>
2). StaticFileHandler
使用原因:因为直接访问静态文件http://127.0.0.1:80/static/html/index.html,对于用户来说体验不好。
本质:是tornado预置的用来提供静态资源文件的Handler,即用路由去匹配。
作用:可以通过tornado.web.StaticFileHandler来映射 静态文件
在配置静态文件的路由的时侯,要将r'/'路由去掉,由静态文件去匹配。
# application.py #StaticFileHandler,要放在所有路由的最下面。 # 用{}传递path参数给StaticFileHandler,告诉用户到哪里去找静态文件。 # 到join(config.BASE_DIRS, "static/html")目录去找静态文件 # 因为配置文件的静态目录是static,但是我们想要访问的静态目录是static目录下的html目录中的文件。因此这里要使用路径拼接,拼接到html目录。 (r'/(.*)$', tornado.web.StaticHandler, {"path": os.path.join(config.BASE_DIRS, "static/html")})
通常,一个网站的首页,是静态文件。
当只访问网站地址http://127.0.0.1:8080,不跟文件名时,怎么让它访问到首页?
在上面的路由中,传递参数default_filename。
(r'/(.*)$', tornado.web.StaticHandler, { "path": os.path.join(config.BASE_DIRS, "static/html"), "default_filename": "index.html"})
参数: path,用来指定提供静态文件的根路径
default_filename,用来指定访问路由中,未指明文件名时,默认提供的静态文件。
注意:要在路由位置的最下面使用,否则其它的路由可能将匹配不到。
posted on 2018-07-29 19:41 myworldworld 阅读(146) 评论(0) 收藏 举报
浙公网安备 33010602011771号