如何实现web_框架_分页?

  -- 思考什么是xss跨站攻击?

    --别人把js代码提交到后台,然后从后台返回数据的时候,别人上传的js变成html中的代码,

      就会插入别人的代码,带来极大的信息泄露的风险,

      tornado后台本身就把前端语言只当作字符串处理

       {% raw 数据 %}     # 把字符变成代码

    -- 为啥不利用一下?

      把分页的字符转成前端语言,不就在后端对分页字符处理下,前端显示不就解决了?

  -- 如何逻辑实现?

    -- 根据数据的长度,每页显示的数据,计算出显示的页数,有余数,总页数多1

    -- 通过for循环,把跳转的a标签编码以字符串的形式拼接进去,

      通过if判断是否为当前页面,当前页面多拼接一个class

    -- 规定一页显示10个跳转a标签,那就得对for循环的条件进行限制,

      start = 当前页面 - 5,end = 当前页面 + 5

       还需要对当前页面小于5或者总页面-10小于当前页面的极端值处理,进行动态处理

    -- 首页字符串必须拼接在最前面,尾页应该拼接中最后的位置,跳转窗口拼接在尾页的后面

    -- 任何的跳转请求,方式都为get方式

    -- 如何实现input窗口跳转?

      -- 通过from表单,获得提交的值,

        通过判断,有form提交,当前页面就变成from表单中数据

如果把这些逻辑写成一个函数?

  -- 好像不行,写成一个类,然后通过调用方法就完美了

  -- 写类前,首先要思考,接收什么数据?输出什么数据?

  -- 在这个类中,需要输入:总共元素长度、获得的页码、form提交的数据,

        需要输出:开始页面数据、结束页面数据、最后拼接好的数据

  -- 获得开始页面数据、结束页面数据,规定好页面展现的数据

  -- 在manager.py文件中写入

#!/usr/bin/python3

import tornado.web
import tornado.ioloop
user_list = []
for i in range(101): # 生成101个数据
data = {'username': 'yizhihua1-' + str(i), 'work': 'student-' + str(i)}
user_list.append(data) class HandlePage(object):
"""定义分页功能模块"""
def __init__(self, page, total_data, go_page): # 把当前页传入进来,和取得的用户信息列表 all_page, c = divmod(total_data, 5) # 计算总的页数,每页显示5行数据
if c > 0:
all_page += 1
self.all_page = all_page if go_page: # 如果有值获得跳转的值,没值相当于没有跳转
page = go_page
try: # 处理页码
page = int(page)
except Exception as e:
print(e)
page = 1
if page < 0:
page = 1
if page > all_page:
page = all_page
self.current_page = page # 获得页码 pass @property
def start(self):
return (self.current_page - 1)*5 # 获得起始位置 @property # 属性方法
def end(self):
return self.current_page*5 # 获得结束位置 def str_page(self, url_page): # url_page定义分页前缀
if self.current_page <= 5: # 判断最前面的页码
start_page = 1
end_page = 11
elif self.current_page >= self.all_page - 5: # 判断最后的页码
start_page = self.all_page - 9
end_page = self.all_page + 1
else:
start_page = self.current_page - 5 # 当前页—5
end_page = self.current_page + 5 # 当前页+5 list_page = [] # 首页
if self.current_page == 1:
first_page = '<a href="javascript:val(0);">首页</a>'
else:
first_page = '<a href="%s%s">首页</a>' % (url_page, 1)
list_page.append(first_page) for p in range(start_page, end_page): # 显示规定的页数
if p == self.current_page: # 进行页码拼接
temp = '<a class="hehe" href="%s%s">%s</a>' % (url_page, p, p) # 判断是否是当前页,给当前页增加一个样式
else:
temp = '<a href="%s%s">%s</a>' % (url_page, p, p) list_page.append(temp) # 尾页
if self.current_page == self.all_page:
last_page = '<a href="javascript:val(0);">尾页</a>'
else:
last_page = '<a href="%s%s">尾页</a>' % (url_page, self.all_page)
list_page.append(last_page) # go页面,通过form表单简单实现了页面跳转
go_page = """
<form class="go_page" action="{}" method="get" >
<input type="text" name="go_page">
<input type="submit" value="Go">
</form>
""".format(url_page)
list_page.append(go_page) str_page = ''.join(list_page) # 把列表变成字符串
return str_page # 传入: page total_data go_page
# 输出:start end str_page class Home(tornado.web.RequestHandler): def get(self, page):
total_data = len(user_list) # 计算数据的长度
obj = HandlePage(page, total_data, self.get_argument('go_page', None))
str_page = obj.str_page('/home/') self.render('home.html', user_list=user_list[obj.start:obj.end], str_page=str_page) # 处理结果传入模板
# user_list进行分片,让其一页显示多少数据 def post(self, *args, **kwargs):
username = self.get_argument('username') # 提交数据处理
work = self.get_argument('work')
temp = {'username': username, 'work': work}
user_list.append(temp)
self.redirect('/home/') # 页面跳转 setting ={
'static_path': 'static',
'template_path': 'template', # 全局静态文件和模版路径设置
} URLS = [
# (r'/login/(?p)', Ajax),
(r'/home/*(?P<page>\d*)', Home), # 路由
] Application = tornado.web.Application( # 让配置生效
URLS, **setting,
) if __name__ == '__main__':
Application.listen(9999) # 启动监听
tornado.ioloop.IOLoop.instance().start() # 启动框架

  -- 在home.html文件中写入

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
<style>
.hehe{
color: red;
}
a{
margin: 3px;
width: 30px;
height: 20px;
background: green;
}
.go_page{
margin: 10px;
width: 222px;
height: 30px;
background: green;
}
</style>
</head>
<body>
<h1>输入数据</h1>
<form action="/home/1" method="post">
<p><input type="text" name="username"></p>
<p><input type="text" name="work"></p>
<p><input type="submit" value="提交数据"></p>
</form>
<h1>展现数据</h1>
<table border="1px">
<thead>
<tr>
<th>用户名</th>
<th>工作</th>
</tr>
</thead> <tbody>
{% for i in user_list %}
<tr> <td>{{ i['username'] }}</td>
<td>{{ i['work'] }}</td> </tr>
{% end %}
</tbody> </table>
<div> <p>页码</p>
<div class="a">{% raw str_page %}</div>
</div> </body>
</html>

  -- 启动manager.py,访问http://127.0.0.1:9999/home/ 就可以进入web页面

上面的代码是有哪些问题?

  -- 上面只是简单实现了,但是数据的生成来源于自己手动生成,并没有通过数据库去取,

  -- 上面的逻辑代码整理并没有按照MTV的格式进行分类整理

  -- html的样式,有点不太美,都是可以自定义,并不怎么认真去定义样式

python_Tornado_web_框架_分页的更多相关文章

  1. 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证

    前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...

  2. SSM框架实现分页

    SSM框架实现分页 1,.首先创建一个分页的工具类 package cn.page.po; import java.io.Serializable; public class Page impleme ...

  3. Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗?

    8:08:01 青春阳光 2017/4/7 8:08:01 大神在吗? Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗? 青春阳光 2017/4/7 8:08:20 还有个问题,上传到pu ...

  4. C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节

    C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C++图形用户界面应用程序框架.它为应用程序开发者提供建立艺术级图形界面 ...

  5. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  6. SSM框架——实现分页和搜索分页

    登录|注册     在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish.       目录视图 摘要视图 订阅 [公告]博客系统优化升级     ...

  7. drf框架中分页组件

    drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination ...

  8. DRF框架中分页功能接口

    目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ...

  9. PHP 框架: CodeIgniter 分页教程

    PHP 框架: CodeIgniter 分页教程 分类: PHP2009-04-23 11:09 3209人阅读 评论(0) 收藏 举报 框架phpbooksdatabaseurl数据库 目录(?)[ ...

随机推荐

  1. iOS 调试心得

    修复 bug 占用我们日常开发的大部分时间,熟练的使用调试工具可以给我们节约大部分的时间. LLDB 的常用命令 expression expresion 是一个非常常用的命令,我们可以通过这个命令来 ...

  2. Zookeeper与Kafka集群搭建

    一 :环境准备: 物理机window7 64位 vmware 3个虚拟机 centos6.8  IP为:192.168.17.[129 -131] JDK1.7安装配置 各虚拟机之间配置免密登录 安装 ...

  3. wemall app商城源码Android 获取XML网络数据并绑定到ListView

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享Android 获取XML网络数据并绑定到Li ...

  4. KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-yilianyun

    koahub-yilianyun 微信易联云打印机接口 koahub-yilianyun易联云打印机node接口 Installation $ npm install koahub-yilianyun ...

  5. 1692: [Usaco2007 Dec]队列变换(BZOJ1640强化版)

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 682  Solved: 280[Submit][Sta ...

  6. linux 部署jenkins

    1.安装jdk,配置jdk路径,python路径 (当前用户的配置文件)  vi .bash_profile export JAVA_HOME=$HOME/local/jdk1.8.0_111 exp ...

  7. 爬取软考试题系列之ip自动代理

    马上5月份有个软件专业等级考试,以下简称软考,为了更好的复习备考,我打算抓取www.rkpass.com网上的软考试题. 以上为背景. 很久没有更新博客园的博客了,所以之前的代码没有及时的贴出来,咱们 ...

  8. mongodb选型问题

    一.Mongodb的介绍 MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便. MongoDB工作在收集和文件的概念. 数据库 数据库是一个物理容器集合.每个数据库都 ...

  9. mybatis基础学习4-插件生成器

    1:安装 2:在所建项目单击右键输入mybatis如下图 *建项目文件时不用建包和类,在配置文件里写即可生成 3:之后在项目生成 自己建的表(这个必须) 单击右键 即可 --------------- ...

  10. 【树莓派】树莓派下WiFi断线自动重连

    实现 WiFi 断线自动重连.原理是用 Python 监测网络是否断线,如果断线则重启网络服务. 1.Python 代码 autowifi.py,放在 /home/pi 目录下: #!/usr/bin ...