模板基础

模板:

在tornado中,模板就是一个html文件,但是模板通过模板语法,由tornado服务渲染之后,可以动态的往页面中填入数据 。tornado自带模板语法,不需要再用其他的模板插件

模板初识:

之前我们通过render可以返回一个html页面,不过那都是固定的页面,固定的数据,但是如果数据是不确定的,是会不断改变的,该怎么做呢?

是否可以先把页面写好,然后预留出固定的位置,在需要的时候再填入数据即可?

04-templates.py文件:

import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
from tornado.web import RequestHandler
from tornado.options import define,options

define('port',default=8080,help='run server',type=int)


class MainHandler(RequestHandler):
    def get(self):
        self.render('in_out.html')
    def post(self):
        name = self.get_argument('name','')
        self.write(name)


class TemHandler(RequestHandler):
    def get(self):
        self.write('hello world')
    def post(self):
        name = self.get_argument('name','')
        self.render('02-templates.html',username= name)

application = tornado.web.Application(
    handlers=[
        (r'/',MainHandler),
        (r'/tem',TemHandler),
    ],
    debug=True,
    template_path = 'templates',
    static_path='static'
)
if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

请求的html表单,in_out.html:

<body>
    <form method="post" action="/tem">
        <p>用户名<input type="text" name="name"></p>
        <p>密码<input type="password" name="password"></p>
        <input type="submit">
    </form>
</body>

返回的html模板,02-templates.html

<body>
    欢迎 {{ username }} 登陆
</body>

模板语法,模板符号:

{{ expression }}

用 {{ expression }} 中间是任何 python 表达式,或者是一个变量

{% directives %}

其他的模板指令

{# … #}

在模板中要注释python表达式的运行,需要使用这个模板语法

{{! {%! {#!

如果不想执行内容,需要在页面上打印出模板符号,只需要加上感叹号( ! )即可。输出源代码

控制语句:if判断

在模板中可以使用 if 判断   注意:最后需要以 {% end %} 结尾

实例如下:

<body>
    欢迎 {{ username }} 登陆
    <br>
    {{ 1+1 }}
    <br>
    {{ time.ctime() }}
    <!--两个大括号可以运行python的表达式-->
    <br>
    <br>
<!--控制流程-->   {#% %#}
    {% if username !='' %}
        欢迎 {{ username }} 登陆
    {% else %}
        请登录
    {% end %}
    <br>
    <br>
    <!--{{ time.ctime() }} 这种方式会在后台仍然执行 下面使用{# #}注释语法-->
    {# time.ctime() #}

    <br>
    <!--不进行运算,将表达式显示在页面-->
    {{! 1+1 }}  

</body>

循环语句:

for 循环:

在 tornado 模板中可以使用 for 循环 注意:最后需要以 {% end %} 结尾

while 循环:

在 tornado 模板中可以使用 while 循环 注意:最后需要以 {% end %} 结尾

python文件中传入变量:

class TemHandler(RequestHandler):
    def get(self):
        self.write('hello world')
    def post(self):
        urllist=[
            ('http://www.baidu.com','百度一下'),
            ('http://www.zhihu.com','知乎'),
            ('http://www.google.com','谷歌'),
        ]
        name = self.get_argument('name','')
        self.render('02-templates.html',
                    username= name,
                    time = time,
                    urllist = urllist,
                    )

模板文件展示:

<body>
     {% for i in urllist %}
    <a href="{{ i[0] }}" target="_blank">{{ i[1] }}</a>
    <br>
    {% end %}
    <br>
    <!--需要提前设置-->
    {% set a =0 %}
    {% while a < 8 %}
        {{ a }} <br>
    {% set a+=1 %}
    {% end %}
</body>

选择模板类型:File--->Setting--->Python Template Languages  (jinja2)

模板转义

转义:

页面并没有解析,只是当作一个字符串,直接在页面上打印出来 tornado默认是自动的转义,传入的数据都会当作字符串,不会被浏览器解析

class TemHandler(RequestHandler):
    def get(self):
        pass
    def post(self):
        atga ='''
        <a href="http://www.baidu.com" target="_blank">百度一下,你就知道</a>
        '''
        self.render('02-templates.html',
                    atga = atga
                    )

application = tornado.web.Application(
    handlers=[
        (r'/',MainHandler),
        (r'/tem',TemHandler),
    ],
    debug=True,
    template_path = 'templates',
    static_path='static',
    autoescape = None, #全局取消转义
)

模板.html

<!DOCTYPE html>
{#取消整个页面的转义#}
{#{% autoescape None %}#}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Templates</title>
</head>
<body>
{#    raw 局部取消转义#}
{#    {%  raw atga %}#}
    <br>
{#    批量取消转义两种方法,1。取消整个页面的转义。2.取消整个项目的转义#}
    {{ atga }}
    {{ atga }}
    {{ atga }}
    {{ atga }}
    {{ atga }}
    {{ atga }}
{#    局部开启转义#}
    {{ escape(atga) }}
</body>
</html>

静态文件引入

设置静态资源目录

application = tornado.web.Application(
    handlers=[
        (r'/',MainHandler),
        (r'/tem',TemHandler),
    ],
    debug=True,
    template_path = 'templates',
    static_path='static',   #设置静态资源文件位置
    autoescape = None, #全局取消转义
)

模板中引入静态资源:static_url为内置方法

两种引入方式

<body>
{% if username !='' %}
    欢迎 {{ username }} 登录
<img src="static/images/01.jpg" width="200px" alt="">
<img src="{{ static_url('images/02.webp') }}" width="200px" alt="">
{% else %}
    亲,请登录
{% end %}
</body>

两种静态资源引入的不同:

原文地址:https://www.cnblogs.com/taoge188/p/10628699.html