热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tornado06、Tornado模板转义和模板继承

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

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 %}

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

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

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

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

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

{{ atag }}

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

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

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

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

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

autoescape=None,

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

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

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

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

#在开启全局和文档不转义的情况下,可以使用 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文件如下:








{% 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')

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

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

#从父模块继承
{% 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" %}

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

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


推荐阅读
  • Java使用poi 5.0解析Excel工作簿的例子
    写在之前Excel文档是日常办公中非常普遍的一种数据记录模式。在业务场景中,往往有“导入Excel到某某系统中”的需求,所以这里记录一种使用poi5.0系 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • web前端工程化之数据绑定
    这篇博客我放了好久都没有来补充了,是因为那时候做前端,有很多东西很迷糊,这些名词都是新的,经过这么长时间的沉淀, ... [详细]
  • 一、前言元素定位可以说是学自动化测试中必会技能之一,也可以说是通往自动化之路的开门钥匙。就元素定位方法,除了我们常用并熟知的8种元素定位方法之外,还有一种定位方法可以说是一种特殊的 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
author-avatar
用户uuexwjx90j
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有