资讯专栏INFORMATION COLUMN

Tornado-06、Tornado模板转义和模板继承

levius / 3093人阅读

摘要:模板转义和模板继承模板的转义默认会自动转义模板中的内容,把标签转换为相应的实体。这样可以防止后端为数据库的网站被恶意脚本攻击。

Tornado模板转义和模板继承


1.模板的转义

Tornado 默认会自动转义模板中的内容,把标签转换为相应的HTML实体。这样可以防止后端为数据库的网站被恶意脚本攻击。比如,你的网站中有一个评论部分,用户可以在这里添加任何他们想说的文字进行讨论。虽然一些HTML标签在标记和样式冲突时不构成重大威胁(如评论中没有闭标签),但标签会允许攻击者加载其他的JavaScript文件,打开通向跨站脚本攻击、XSS或漏洞之门。

首先 我们在tornado文件夹下新建一个lesson5文件夹 添加templates文件夹
在lesson5下新建一个start1.py文件 加入以下代码

#路由为:
(r"/temp",TempHandler),

class TempHandler(tornado.web.RequestHandler):
    def get(self):
        username = self.get_argument("name","no")
        import time
        urllist = [
            ("https://www.baidu.com/","百度"),
            ("https://www.zhihu.com/","知乎"),
        ]  
        self.render("escape.html",
                    username=username,
                    time=time,
                    urllist=urllist,
                    )

在templates文件夹下新建escape.html文件 并在该文件的body中添加以下代码

{% for url in urllist %}
    {{ url[1] }} 
{% end %}

这个地方我们添加了链接,我们可以在页面上点击相应的页面来跳转到其他的页面去。



接下来我们在TempHandler服务中添加或修改成如下代码:

atag = ""---百度---" 
" self.render("escape.html", username=username, time=time, urllist=urllist, atag=atag )

并在escape.html的body中加入以下代码

{{ atag }}

这个时候我们再来看看页面


我们发现这个时候我们加上的这个代码是作为一个字符串输出,并没有被浏览器解析出来,这个就是转义,tornado会自动的转义,把所有的输出都作为字符串,这样做的就能防止一些恶意代码在输出到前端时被执行,从而造成数据泄露。

当然这个默认自动是转义的,如果不要转义也是可以的,有如下方法:

1.取消全局转义,在Application中添加配置项

autoescape=None,

2.注释掉上面的autoescape=None在html文档最开始添加

{% autoescape None %}   #实现整个文档的取消转义

#在开启全局和文档不转义的情况下,可以使用  escape() 来开启变量的转义
{{ atag }}
{{ escape(atag) }}

3.也可以使用 {% raw xxx %} 来输出不转义内容

{% raw atag %}

tornado是默认自动开启转义的,大家可以根据需求来选是否转义,但是要知道转义的本意是来防止浏览器意外执行恶意代码的,所以去掉转义的时候需要谨慎选择。

static_url函数来生成static目录下的URL



引用静态文件有上面 两种写法,使用上面的这种形式,那么为什么使用static_url而不是在你的模板中硬编码呢?有如下几个原因。其一,static_url函数创建了一个基于文件内容的hash值,并将其添加到URL末尾(查询字符串的参数v)。这个hash值确保浏览器总是加载一个文件的最新版而不是之前的缓存版本。无论是在你应用的开发阶段,还是在部署到生产环境使用时,都非常有用,因为你的用户不必再为了看到你的静态内容而清除浏览器缓存了。

2.模板的继承

把多个页面相同的内容提取出来放在一个base.html文件中,各个子html文件不同的内容 使用块语句占位,子html文件重写这个块中的内容。

base.html文件如下:

 
    
    
        
        Tornado
    
    
        {% block body%}
        
this is base {% end %} {% block js %}{% end %}

extend.html如下


{% extends "./base.html" %}

服务器代码如下:

#路由映射如下
(r"/base",BaseIndexHandler),
(r"/extends",ExtendsHandler),

class BaseIndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("base.html")

class ExtendsHandler(tornado.web.RequestHandler):
    def get(self):
        username = "haha"
        self.render("extend.html")




在上面,我们可以看到继承的模板里面没有写任何东西,只是继承了父模板,同样父模板的所有内容就都可以继承过来了,省去了大量的重复部分代码。

#从父模块继承
{% extend filename %}

#继承时子模板替换父模板中同名的块
{% block name %}
    #这里写的内容会替换模板中的内容,如果不写使用父模板的内容
{% end %}

#引入其他的模板文件
{% include filename %}

先在base.html 的body中添加下列代码

  {% block handy%}
        
this is handy {% end %}

继承之后可以重写父类的块
在templates文件夹下新建extend.html文件

{% extends "./base.html" %}
 
    {% block title %} {{ username }} {% end %}

    
    {% block body %}
        {% if username!="no" %}
            欢迎用户 {{ username }} 登录
            
我是继承的 哈哈哈
hahahaha{% include "./include.html" %} {% else %} 您还没有登录 {% end %} {% end %}

记住,当页面继承其他页面之后,需要实现相应的块才有作用,在块外面的代码是没有作用的。

当然可以引入模板,include.html如下:

您还没有登录

在extends.html中添加如下:

hahahaha{% include "./include.html" %}

执行之后就可以看到效果。



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44641.html

相关文章

  • Tornado 4.3文档翻译: 用户指南-模板UI

    摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同样可以使用这两个关键字,这无疑是一种进步。其次...

    shiguibiao 评论0 收藏0
  • Tornado学习笔记(2)

    摘要:而这里的方法则是告诉来读取模板文件,并将结果返回给浏览器。依旧可以使用,等条件控制语句,但是要记得以结尾。替换字符串中的字符为编码形式。模块模块是封装模板中包含的标记样式以及行为的可复用组件。 表单和模板 import os.path import tornado.httpserver import tornado.ioloop import tornado.options impo...

    tianyu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<