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>
原文地址:https://www.cnblogs.com/xuchengcheng1215/p/8982524.html