第二百六十七节,Tornado框架-分页封装模块
Tornado框架-分页封装模块
框架引擎
#!/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()
封装分页类模块
写一个类来封装分页功能
__init__接收各种需要的参数
shu_ju_fan_wei()方法,返回的显示范围数据
xian_shi_ye_ma()方法,返回页码数据
#!/usr/bin/env python #coding:utf-8 #封装分页类模块 class fen_ye_lei: def __init__(self,dang_qian_ye,shu_ju,tiao_shu,ye_ma_shu,qian_hou_ye,url): """ 一个参数接收当前页 第一个参数,接收分页数据列表 第二个参数,接收每页显示多少条数据 第三个参数,每页显示多少个页码 第四个参数,显示当前页码前几个和后几个页码,需要结合每页显示多少个页码计算 第五个参数,分页连接url后缀,也就是路由映射的后缀 """ try: #尝试执行 dang_qian_ye = int(dang_qian_ye) #将当前页换成数字类型 except: #如果出错 dang_qian_ye = 1 #当前页等于1 if dang_qian_ye < 1: #判断当前页如果小于1 dang_qian_ye = 1 #当前页等于1 self.dang_qian_ye = dang_qian_ye #当前页 self.shu_ju = shu_ju #接收分页数据列表 self.tiao_shu = tiao_shu #接收每页显示多少条数据 self.ye_ma_shu = ye_ma_shu #每页显示多少个页码 self.qian_hou_ye = qian_hou_ye #显示当前页码前几个和后几个页码,需要结合每页显示多少个页码计算 self.url = url #分页连接url后缀,也就是路由映射的后缀 # 计算总页码 zong_ye_ma, c = divmod(len(self.shu_ju), self.tiao_shu) #数据总量除以显示条数,取余,两个变量接收,第一个变量得到相除后的整数,后一个变量得到相除后的余数(小数) if c > 0: #判断余数如果大于0, zong_ye_ma += 1 #页面数等于整数加1,等于分页总量 self.zong_ye_ma = zong_ye_ma #接收总页码 def shu_ju_fan_wei(self): """ shu_ju_fan_wei()方法,返回每页获取范围数据 """ #换算每页获取范围数据 qi_shi = (self.dang_qian_ye - 1) * self.tiao_shu #当前页码获取数据起始位置 jie_shu = self.dang_qian_ye * self.tiao_shu #当前页码获取数据结束位置 xian_shi = self.shu_ju[qi_shi:jie_shu] #通过起始和结束位置以下标方式获取指定范围的列表数据,xian_shi传到html模板显示数据 return xian_shi def xian_shi_ye_ma(self): """ xian_shi_ye_ma()方法,返回页码数据 """ # 计算每页显示多少个页码 # 假设每页显示11个页码,当前页的前5个和后5个 # 所以需要动态调整循环里的值 if self.zong_ye_ma < self.ye_ma_shu: # 判断总页码小于每页显示多少个页码 s = 1 # 起始页码为1 t = self.zong_ye_ma # 结束页码为总页码 else: if self.dang_qian_ye <= self.qian_hou_ye + 1: # 判断当前页码小于前后页码数 s = 1 # 起始页码为1 t = self.ye_ma_shu # 结束页码为每页显示多少个页码 else: if (self.dang_qian_ye + self.qian_hou_ye) > self.zong_ye_ma: # 判断当前页加前后页码数如果大于总页码数 s = self.zong_ye_ma - (self.ye_ma_shu - 1) # 起始页为总页数减以(每页显示多少个页码减一) t = self.zong_ye_ma # 结束页为总页码数 else: s = self.dang_qian_ye - self.qian_hou_ye # 起始页为当前页减以前后页码数 t = self.dang_qian_ye + self.qian_hou_ye # 结束页为当前页加前后页码数 ye_ma_lie_biao = [] # 创建列表接收页码数据 #首页 sh_temp = '<li><a href="%s1">首页</a></li>' % (self.url) ye_ma_lie_biao.append(sh_temp) #上一页 if self.dang_qian_ye <= 1: shye = '<li><a href="javascript:void(0);">上一页</a></li>' ye_ma_lie_biao.append(shye) else: shye = '<li><a href="%s%s">上一页</a></li>' %(self.url,self.dang_qian_ye-1) ye_ma_lie_biao.append(shye) for i in range(s, t + 1): # 根据分页总量循环次数 if i == self.dang_qian_ye: # 判断循环到的页码等于当前页面 temp = '<li class="yem"><a href="%s%s">%s</a></li>' % (self.url,i, i) # 格式化当前页码设置样式 else: temp = '<li><a href="%s%s">%s</a></li>' % (self.url,i, i) # 格式化当前页码 ye_ma_lie_biao.append(temp) # 将格式化的页码数据追加到列表 #下一页 if self.dang_qian_ye >= self.zong_ye_ma: xye = '<li><a href="javascript:void(0);">下一页</a></li>' ye_ma_lie_biao.append(xye) else: xye = '<li><a href="%s%s">下一页</a></li>' %(self.url,self.dang_qian_ye+1) ye_ma_lie_biao.append(xye) #尾页 wei_temp = '<li><a href="%s%s">尾页</a></li>' % (self.url,self.zong_ye_ma) ye_ma_lie_biao.append(wei_temp) xian_shi = "\n".join(ye_ma_lie_biao) # 将页面数据,连接成一个字符串,传输到HTML模板 return xian_shi
逻辑处理
#!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web #导入tornado模块下的web文件 from pymkuai import fenye #导入分页模块 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方式请求 fen_ye = fenye.fen_ye_lei(page,SHUJU,10,11,5,'/index/') #执行分页对象 if fen_ye.dang_qian_ye > fen_ye.zong_ye_ma: #判断分页对象里的当前页码如果大于总页码 zfchdqy = str(fen_ye.zong_ye_ma) #将总页码转换成字符串 self.redirect("/index/" + zfchdqy) #跳转到总页码 else: self.render("index.html",dqy=fen_ye.dang_qian_ye,shuju=fen_ye.shu_ju_fan_wei(),yem=fen_ye.xian_shi_ye_ma()) # 显示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/{{dqy}}"> 用户名:<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>{{i["emia"]}}</td> </tr> {% end %} </tbody> </table> <ul class="fy"> {% raw yem %} </ul> </body> </html>