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)    收藏  举报

导航