flask里实现分页功能的方法
小编给大家分享一下flask里实现分页功能的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!
在web开发中,分页是必不可少的功能,Flask实现展示内容的分页也非常简单,这里通过实例来学习一下Flask如何为网站分页。
首先,自定义一个分页工具类page_utils:
fromurllibimporturlencodeclassPagination(object):def__init__(self,current_page,total_count,base_url,params,per_page_count=10,max_pager_count=11):try:current_page=int(current_page)exceptExceptionase:current_page=1ifcurrent_page<=0:current_page=1self.current_page=current_pageself.total_count=total_countself.per_page_count=per_page_countmax_page_num,div=divmod(total_count,per_page_count)ifdiv:max_page_num+=1self.max_page_num=max_page_numself.max_pager_count=max_pager_countself.half_max_pager_count=int((max_pager_count-1)/2)self.base_url=base_urlimportcopyparams=copy.deepcopy(params)get_dict=params.to_dict()self.params=get_dict@propertydefstart(self):return(self.current_page-1)*self.per_page_count@propertydefend(self):returnself.current_page*self.per_page_countdefpage_html(self):ifself.max_page_num<=self.max_pager_count:pager_start=1pager_end=self.max_page_num#如果总页数>11else:ifself.current_page<=self.half_max_pager_count:pager_start=1pager_end=self.max_pager_countelse:if(self.current_page+self.half_max_pager_count)>self.max_page_num:pager_end=self.max_page_numpager_start=self.max_page_num-self.max_pager_count+1#倒这数11个else:pager_start=self.current_page-self.half_max_pager_countpager_end=self.current_page+self.half_max_pager_countpage_html_list=[]self.params['page']=1first_page='<li><ahref="%s?%s">首页</a></li>'.decode("utf-8")%(self.base_url,urlencode(self.params),)page_html_list.append(first_page)self.params["page"]=self.current_page-1ifself.params["page"]<1:pervious_page='<liclass="disabled"><ahref="%s?%s"aria-label="Previous">上一页</span></a></li>'.decode("utf-8")%(self.base_url,urlencode(self.params))else:pervious_page='<li><ahref="%s?%s"aria-label="Previous">上一页</span></a></li>'.decode("utf-8")%(self.base_url,urlencode(self.params))page_html_list.append(pervious_page)#中间页码foriinrange(pager_start,pager_end+1):self.params['page']=iifi==self.current_page:temp='<liclass="active"><ahref="%s?%s">%s</a></li>'%(self.base_url,urlencode(self.params),i,)else:temp='<li><ahref="%s?%s">%s</a></li>'%(self.base_url,urlencode(self.params),i,)page_html_list.append(temp)self.params["page"]=self.current_page+1ifself.params["page"]>self.max_page_num:self.params["page"]=self.current_pagenext_page='<liclass="disabled"><ahref="%s?%s"aria-label="Next">下一页</span></a></li>'.decode("utf-8")%(self.base_url,urlencode(self.params))else:next_page='<li><ahref="%s?%s"aria-label="Next">下一页</span></a></li>'.decode("utf-8")%(self.base_url,urlencode(self.params))page_html_list.append(next_page)self.params['page']=self.max_page_numlast_page='<li><ahref="%s?%s">尾页</a></li>'.decode("utf-8")%(self.base_url,urlencode(self.params),)page_html_list.append(last_page)return''.join(page_html_list)
自定义方法中的参数:
current_page——表示当前页。
total_count——表示数据总条数。
base_url——表示分页URL前缀,请求的前缀获取可以通过Flask的request.path方法,无需自己指定。
例如:我们的路由方法为@app.route('/test'),request.path方法即可获取/test。
params——表示请求传入的数据,params可以通过request.args动态获取。
例如:我们链接点击为:http://localhost:5000/test?page=10,此时request.args获取数据为ImmutableMultiDict([('page', u'10')])
per_page_count——指定每页显示数。
max_pager_count——指定页面最大显示页码
接着,我们使用一个测试方法来使用这个工具类,达到分页效果,test.py:
fromflaskimportFlask,render_template,requestfrompage_utilsimportPaginationapp=Flask(__name__)@app.route('/test')deftest():li=[]foriinrange(1,100):li.append(i)pager_obj=Pagination(request.args.get("page",1),len(li),request.path,request.args,per_page_count=10)print(request.path)print(request.args)index_list=li[pager_obj.start:pager_obj.end]html=pager_obj.page_html()returnrender_template("obj/test.html",index_list=index_list,html=html)if__name__=='__main__':app.run(debug=True)
在上面的程序中,li为我们要分页的对象,数组list,我们获取到这个list之后,把他用工具类中的起止方法包起来。
传递数据用包装后的list,这样就达到了需要哪一段数据我们传递哪一段的效果,包装的方法:index_list = li[pager_obj.start:pager_obj.end]
我们用一个HTML页面去显示它,分页样式不是重点,我们这里直接引入bootstrap封装好的分页效果,代码如下:
<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Title</title><linkrel="stylesheet"href="{{url_for('static',filename='css/bootstrap.min.css')}}"><style>.container{margin-top:20px;}</style></head><body><div><divclass="row"style="margin-top:10px"><ul>{%forfooinindex_list%}<li>{{foo}}:这是列表内容~~</li>{%endfor%}</ul><navaria-label="Pagenavigation"><ul>{{html|safe}}</ul></nav></div></div></body></html>
这样一个分页的效果就做好了,我们查看效果,如下图:
看完了这篇文章,相信你对flask里实现分页功能的方法有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。