python_Tornado_web_框架_分页
如何实现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_框架_分页的更多相关文章
- 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证
前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...
- SSM框架实现分页
SSM框架实现分页 1,.首先创建一个分页的工具类 package cn.page.po; import java.io.Serializable; public class Page impleme ...
- Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗?
8:08:01 青春阳光 2017/4/7 8:08:01 大神在吗? Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗? 青春阳光 2017/4/7 8:08:20 还有个问题,上传到pu ...
- C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节
C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C++图形用户界面应用程序框架.它为应用程序开发者提供建立艺术级图形界面 ...
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
- SSM框架——实现分页和搜索分页
登录|注册 在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish. 目录视图 摘要视图 订阅 [公告]博客系统优化升级 ...
- drf框架中分页组件
drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination ...
- DRF框架中分页功能接口
目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ...
- PHP 框架: CodeIgniter 分页教程
PHP 框架: CodeIgniter 分页教程 分类: PHP2009-04-23 11:09 3209人阅读 评论(0) 收藏 举报 框架phpbooksdatabaseurl数据库 目录(?)[ ...
随机推荐
- DOM树的增查改删总结
DOM树的增查改删总结 摘要:对HTML DOM的操作是前端JavaScript编程时必备的技能,本文是我自己对DOM树操作的总结,主要是方法的罗列,原理性的讲述较少,适合大家用于理清思路或是温习 一 ...
- Linux 内存优化
1.清理前内存使用情况 free -m2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: ...
- mysql忘掉密码
1. 先杀掉mysqld的进程: service mysql stop 2. 使用skip-grant-tables这个选项启动MySQL: vi /etc/my.cnf 在mysqld 下添加 sk ...
- Linux tomcat设置ip地址直接访问,tomcat设置ip地址直接访问,tomcat绑定ip地址
Linux tomcat设置ip地址直接访问,tomcat设置ip地址直接访问,tomcat绑定ip地址 >>>>>>>>>>>> ...
- C#基础——集合及特殊集合
集合 集合的基本信息: Systerm.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合. Systerm.Collections.Ge ...
- progID
ProgID程序员给CLSID指定的容易记住的名字ProgID命名约定:<Program>.<Component>.<Version>AppID:将某个APPID( ...
- Asp.Net 常用工具类之Office—Excel导出(4)
开发过程中各类报表导入导出防不胜防,网上也是各种解决方法层出不穷,比如Excel,CSV,Word,PDF,HTML等等... 网上各种导出插件也是层出不穷,NPOI,微软Microsoft.Offi ...
- 转换器4:手写PHP转Python编译器,语法解析部分
写完词法部分,又有很多杂事,周末终于有空来实现伟大的语法解析部分了. 撸完代码之后发现,程序太短了,不算上状态机,才186行(含注释),关键代码不到100行.运行调试过后,发现还行.居然可以解析One ...
- poolingHttpclientConnectionmanager 使用
在阅读 netflix zuul 的simpleHostRoutingFilter 中,发现了一些问题. 主要是关于poolingHttpclientConnectionmanager. 在寻找其中的 ...
- Kali linux learning note
from:http://blog.sina.com.cn/s/blog_40983e5e0101dhz0.html 因为kali linux基于debian 7,当然要把这台Acer 4736 ...