第二百六十六节,Tornado框架-XSS处理,页码计算,页码显示
Tornado框架-XSS处理,页码计算,页码显示
Tornado框架-XSS攻击过滤
注意:Tornado框架的模板语言,读取数据已经自动处理了XSS攻击,过滤转换了危险字符
如果要使危险字符可以远行,就需要在模板语言接收数据的地方{% raw 接收数据变量 %}
raw写在模板语言里,用{% raw 接收变量%},让接收到的数据如果有html标签等进行原始显示,也就是可以运行,分页会用到
框架引擎
#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
from controllers import index settings = { #html文件归类配置,设置一个字典
"template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称
"static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称
} #路由映射
application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法
(r"/index/(?P<page>\d*)", index.indexHandler), #正则匹配访问路径,访问录index/后面可以是可以是0个或多个数字
],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__":
#内部socket运行起来
application.listen(8888) #设置端口
tornado.ioloop.IOLoop.instance().start()
逻辑处理
#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
SHUJU = [
{"user":"lgx","emia":"729088188@qq.com"}
] #逻辑处理 class indexHandler(tornado.web.RequestHandler): #定义一个类,继承tornado.web下的RequestHandler类
def get(self,page): #get()方法,接收get方式请求
#接收路由映射正则名称page,也就是用户访问的后缀,也就是访问的页码
#假如每页显示5条信息,page就是当前页
#第一页就应该获取SHUJU全局变量里的0-5条
#第二页就应该获取SHUJU全局变量里的5-10条 #换算页码获取数据范围的公式
#当前页码减去1乘以显示条数=当前页获取数据的起始条数,也就是从第几条开始获取
#当前页码乘以显示条数=当前页获取数据的结束条数,也就是从第几条结束获取 try: #尝试执行
page = int(page) #将页码转换成数字类型
except: #如果出错
page = 1 #将页码等于1
if page < 1: #判断页面如果小于1
page = 1 #页码等于1 kaishi = (page - 1) * 5 #当前页码获取数据起始位置
jieshu = page * 5 #当前页码获取数据结束位置
xianshi = SHUJU[kaishi:jieshu] #通过起始和结束位置以下标方式获取指定范围的列表数据 self.render("index.html",shuju = xianshi,yema = page) #显示index.html文件,通过起始和结束位置以下标方式获取指定范围的数据传入模板,传值页码 def post(self,page):
user = self.get_argument("user") #接收用户提交的用户名
emia = self.get_argument("emia") #接收用户提交的邮箱
temp = {"user":user,"emia":emia} #将邮箱和用户名组合成字典,
SHUJU.append(temp) #将字典追加到SHUJU全局变量
self.redirect("/index/" + page) #跳转到当前页面
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href='{{static_url("s1.css")}}'>
</head>
<body>
<h1>提交数据</h1>
<form method="post" action="/index/{{yema}}">
用户名:<input name="user" type="text"/>
邮箱:<input name="emia" type="text"/>
<input type="submit" value="提交"/>
</form>
<h1>显示数据</h1>
<table border="1">
<thead>
<tr>
<th>用户名</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<!--循环接收到的shuju显示到表格-->
{% for i in shuju %}
<tr>
<td>{{i["user"]}}</td>
<td>{% raw i["emia"] %}</td>
</tr>
{% end %}
</tbody>
</table>
</body>
</html>


计算页码
第一步、数据总量除以显示条数,取余,两个变量接收,第一个变量得到相除后的整数,后一个变量得到相除后的余数(小数)
1、判断余数如果大于0,页面数等于整数加1,等于分页总量
第二步、定义一个列表接收分页数据
1、根据分页总量循环次数
2、判断循环到的页码等于当前页面,格式化当前页码设置样式
3、否则格式化当前页码,将格式化的页码数据追加到列表
4、将列表连接长一串字符串
5、将字符串传递到html模板
第三步、在html模板接收传递过来的字符串
模板引擎
#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
from controllers import index settings = { #html文件归类配置,设置一个字典
"template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称
"static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称
} #路由映射
application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法
(r"/index/(?P<page>\d*)", index.indexHandler), #正则匹配访问路径,访问录index/后面可以是可以是0个或多个数字
],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__":
#内部socket运行起来
application.listen(8888) #设置端口
tornado.ioloop.IOLoop.instance().start()
逻辑处理
#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
SHUJU = [
{"user":"lgx","emia":"729088188@qq.com"}
]
for f in range(300):
SHUJU.append({"user": "lgx", "emia": "729088188@qq.com"}) #填充数据到300条 #逻辑处理 class indexHandler(tornado.web.RequestHandler): #定义一个类,继承tornado.web下的RequestHandler类
def get(self,page): #get()方法,接收get方式请求
#接收路由映射正则名称page,也就是用户访问的后缀,也就是访问的页码
#假如每页显示5条信息,page就是当前页
#第一页就应该获取SHUJU全局变量里的0-5条
#第二页就应该获取SHUJU全局变量里的5-10条 #换算页码获取数据范围的公式
#当前页码减去1乘以显示条数=当前页获取数据的起始条数,也就是从第几条开始获取
#当前页码乘以显示条数=当前页获取数据的结束条数,也就是从第几条结束获取 try: #尝试执行
page = int(page) #将页码转换成数字类型
except: #如果出错
page = 1 #将页码等于1
if page < 1: #判断页面如果小于1
page = 1 #页码等于1 kaishi = (page - 1) * 5 #当前页码获取数据起始位置
jieshu = page * 5 #当前页码获取数据结束位置
xianshi = SHUJU[kaishi:jieshu] #通过起始和结束位置以下标方式获取指定范围的列表数据 #计算页码显示
zyema,c = divmod(len(SHUJU),5) #数据总量除以显示条数,取余,两个变量接收,第一个变量得到相除后的整数,后一个变量得到相除后的余数(小数)
if c > 0: #判断余数如果大于0,
zyema += 1 #页面数等于整数加1,等于分页总量 yema = [] #定义一个列表接收分页数据
for i in range(zyema): #根据分页总量循环次数
if i+1 == page: #判断循环到的页码等于当前页面
temp = '<li class="yem"><a href="/index/%s">%s</a></li>' % (i+1,i+1) #格式化当前页码设置样式
else:
temp = '<li><a href="/index/%s">%s</a></li>' % (i + 1, i + 1) #格式化当前页码
yema.append(temp) #将格式化的页码数据追加到列表
zfpage = "".join(yema) #将列表连接长一串字符串 self.render("index.html",shuju = xianshi,yema = page,zfpage = zfpage) #显示index.html文件,传递当前页码,传递分页显示页码 def post(self,page):
user = self.get_argument("user") #接收用户提交的用户名
emia = self.get_argument("emia") #接收用户提交的邮箱
temp = {"user":user,"emia":emia} #将邮箱和用户名组合成字典,
SHUJU.append(temp) #将字典追加到SHUJU全局变量
self.redirect("/index/" + page) #跳转到当前页面
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href='{{static_url("s1.css")}}'>
</head>
<body>
<h1>提交数据</h1>
<form method="post" action="/index/{{yema}}">
用户名:<input name="user" type="text"/>
邮箱:<input name="emia" type="text"/>
<input type="submit" value="提交"/>
</form>
<h1>显示数据</h1>
<table border="1">
<thead>
<tr>
<th>用户名</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<!--循环接收到的shuju显示到表格-->
{% for i in shuju %}
<tr>
<td>{{i["user"]}}</td>
<td>{% raw i["emia"] %}</td>
</tr>
{% end %}
</tbody>
</table>
<ul class="fy">
{% raw zfpage %}
</ul>
</body>
</html>

页码显示
计算每页显示多少个页码
假设每页显示11个页码,当前页的前5个和后5个
所以需要动态调整循环里的值
框架引擎
#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
from controllers import index settings = { #html文件归类配置,设置一个字典
"template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称
"static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称
} #路由映射
application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法
(r"/index/(?P<page>\d*)", index.indexHandler), #正则匹配访问路径,访问录index/后面可以是可以是0个或多个数字
],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__":
#内部socket运行起来
application.listen(8888) #设置端口
tornado.ioloop.IOLoop.instance().start()
逻辑处理
#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
SHUJU = [
{"user":"lgx","emia":"729088188@qq.com"}
]
for f in range(300):
SHUJU.append({"user": "lgx", "emia": "729088188@qq.com"}) #填充数据到300条 #逻辑处理 class indexHandler(tornado.web.RequestHandler): #定义一个类,继承tornado.web下的RequestHandler类
def get(self,page): #get()方法,接收get方式请求
#接收路由映射正则名称page,也就是用户访问的后缀,也就是访问的页码
#假如每页显示5条信息,page就是当前页
#第一页就应该获取SHUJU全局变量里的0-5条
#第二页就应该获取SHUJU全局变量里的5-10条 #换算页码获取数据范围的公式
#当前页码减去1乘以显示条数=当前页获取数据的起始条数,也就是从第几条开始获取
#当前页码乘以显示条数=当前页获取数据的结束条数,也就是从第几条结束获取 try: #尝试执行
page = int(page) #将页码转换成数字类型
except: #如果出错
page = 1 #将页码等于1
if page < 1: #判断页面如果小于1
page = 1 #页码等于1 kaishi = (page - 1) * 5 #当前页码获取数据起始位置
jieshu = page * 5 #当前页码获取数据结束位置
xianshi = SHUJU[kaishi:jieshu] #通过起始和结束位置以下标方式获取指定范围的列表数据 #计算页码显示
zyema,c = divmod(len(SHUJU),5) #数据总量除以显示条数,取余,两个变量接收,第一个变量得到相除后的整数,后一个变量得到相除后的余数(小数)
if c > 0: #判断余数如果大于0,
zyema += 1 #页面数等于整数加1,等于分页总量 yema = [] #定义一个列表接收分页数据 #计算每页显示多少个页码
#假设每页显示11个页码,当前页的前5个和后5个
#所以需要动态调整循环里的值
if zyema < 11: #判断总页码小于11
s = 1 #起始页码为1
t = zyema #结束页码为总页码
else:
if page <= 6: #判断当前页码小于等于6
s = 1 #起始页码为1
t = 11 #结束页码为11
else:
if (page + 5) > zyema: #判断当前页加5如果大于总页数
s = zyema - 10 #起始页为总页数减以10
t = zyema #结束页为总页数
else:
s = page - 5 #起始页为当前页减以5
t = page + 5 #结束页为当前页加5 for i in range(s,t+1): #根据分页总量循环次数
if i == page: #判断循环到的页码等于当前页面
temp = '<li class="yem"><a href="/index/%s">%s</a></li>' % (i,i) #格式化当前页码设置样式
else:
temp = '<li><a href="/index/%s">%s</a></li>' % (i, i) #格式化当前页码
yema.append(temp) #将格式化的页码数据追加到列表
zfpage = "".join(yema) #将列表连接长一串字符串 self.render("index.html",shuju = xianshi,yema = page,zfpage = zfpage) #显示index.html文件,传递当前页码,传递分页显示页码 def post(self,page):
user = self.get_argument("user") #接收用户提交的用户名
emia = self.get_argument("emia") #接收用户提交的邮箱
temp = {"user":user,"emia":emia} #将邮箱和用户名组合成字典,
SHUJU.append(temp) #将字典追加到SHUJU全局变量
self.redirect("/index/" + page) #跳转到当前页面
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href='{{static_url("s1.css")}}'>
</head>
<body>
<h1>提交数据</h1>
<form method="post" action="/index/{{yema}}">
用户名:<input name="user" type="text"/>
邮箱:<input name="emia" type="text"/>
<input type="submit" value="提交"/>
</form>
<h1>显示数据</h1>
<table border="1">
<thead>
<tr>
<th>用户名</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<!--循环接收到的shuju显示到表格-->
{% for i in shuju %}
<tr>
<td>{{i["user"]}}</td>
<td>{% raw i["emia"] %}</td>
</tr>
{% end %}
</tbody>
</table>
<ul class="fy">
{% raw zfpage %}
</ul>
</body>
</html>
第二百六十六节,Tornado框架-XSS处理,页码计算,页码显示的更多相关文章
- 第二百七十三节,Tornado框架-文件上传
Tornado框架-文件上传 第一.普通表单上传文件 self.request.files["fafafa"] 获取上传文件信息,参数["上传文件框的name名称&quo ...
- 第二百六十八节,Tornado框架-路由映射之二级域名支持,html模板继承以及导入
Tornado框架-路由映射之二级域名支持,html模板继承以及导入 二级域名路由映射add_handlers()设置二级域名路由映射 注意:二级域名需要结合服务器ip绑定域名 框架引擎 #!/usr ...
- 第二百六十三节,Tornado框架-基于正则的动态路由映射
Tornado框架-基于正则的动态路由映射 1.在路由映射条件里用正则匹配访问路径后缀2.给每一个正则匹配规则(?P<设置名称>)设置一个名称,3.在逻辑处理的get()方法或post() ...
- 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)
MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...
- 第二百二十六节,jQuery EasyUI,Tree(树)组件
jQuery EasyUI,Tree(树)组件 本节课重点了解 EasyUI 中 Tree(树)组件的使用方法,这个组件依赖于 Draggable(拖 动)和 Droppable(放置)组件. 一.加 ...
- 第二百三十六节,Bootstrap辅组类和响应式工具
Bootstrap辅组类和响应式工具 学习要点: 1.辅组类 2.响应式工具 本节课我们主要学习一下 Bootstrap 的辅组类和响应式工具,辅助类提供了一组类来辅 组页面设计,而响应式工具则利用媒 ...
- 第二百七十六节,MySQL数据库,【显示、创建、选定、删除数据库】,【用户管理、对用户增删改查以及授权】
MySQL数据库,[显示.创建.选定.删除数据库],[用户管理.对用户增删改查以及授权] 1.显示数据库 SHOW DATABASES;显示数据库 SHOW DATABASES; mysql - 用户 ...
- leecode第二百三十六题(二叉树的最近公共祖先)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- 第二百七十四节,同源策略和跨域Ajax
同源策略和跨域Ajax 什么是同源策略 尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措 ...
- 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库
MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...
随机推荐
- UNIX网络编程学习笔记:值-结果(value-result)参数
前言 当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针.结构的长度也作为参数来传递,其传递的方式取决于结构的传递方向:从进程到内核,还是从内核到进程. 1.从进 ...
- Statusbar、Menubar、Toolbar合集
In the last example of this section, we create a menubar, a toolbar and a statusbar. We also create ...
- ant design pro (八)构建和发布
一.概述 原文地址:https://pro.ant.design/docs/deploy-cn 二.详细 2.1.构建 当项目开发完毕,只需要运行一行命令就可以打包你的应用: npm run buil ...
- Linux环境下GNU, GCC, G++编译器(转)
一,GNU GNU是“GNU 's Not Unix”的递归缩写, Stallman宣布GNU应当发音为Guh-NOO(革奴)以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new ...
- js 获取iframe页面元素
js 获取iframe页面元素 CreationTime--2018年8月16日18点00分 Author:Marydon <!-- chart图表 --> <iframe id ...
- 【BIRT】报表显示不全
使用BIRT开发了一张报表,预期效果如下 但是开发完成后预览效果如下: 最后的合计竟然没有了,那么怎么处理呢 鼠标点击Layout窗口空白部分,找到布局,切换为自动布局,如下图所示:
- 35 、HashSet详解
HashSet特点 1.不能保证元素的排列顺序 2.没有重复元素 3.HashSet不是同步的,多个线程同时访问一个HashSet,需要通过代码来保持同步 4.集合元素可以是null 当向HashSe ...
- 深入理解Android的密度独立性
前言 安卓是一个只对硬件设备限制有很少限制的移动操作系统.生产商们几乎可以创造任何形状的.尺寸的和密度的屏幕的设备.设备可以有物理键盘和按钮或者只有虚 拟键盘和按钮.由于它的设备客制化的自由性给软件开 ...
- C#基础—不安全代码(unsafe code)
1.为何要有unsafe 也许是为了实现CLR类型安全的目标吧,默认情况下,C#没有提供指针的使用算法,但是有些情况下也可能需要指针这样直接访问内存的东西(虽然目前我还没有用过),但是有时候程序员非常 ...
- NHibernate中ISession的Flush
不知道在执行Insert或者Delete,update之后为什么要调用Flush(),后来看了http://www.cnblogs.com/lyj/archive/2008/10/17/1313612 ...