如何实现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; 30px; height: 20px; background: green; } .go_page{ margin: 10px; 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的样式,有点不太美,都是可以自定义,并不怎么认真去定义样式