如今开发一个网站,分页是一个很常见的功能了,尤为是当数据达到必定量的时候,若是都显示在页面上,会形成页面过长而影响用户体验,除此以外,还可能出现加载过慢等问题。所以,分页就颇有必要了。css
分页功能的经常使用的实现方法有两种:前台分页和后台分页。前台分页就是一次查询取出全部数据保存在内存中,须要的时候就从相应区间中取数据,但只适用于少许数据的状况。后台分页就是查询时只取出相应区间中的数据并返回,翻页时再次查询并取数据,此方法能减少传输压力提升性能。今天这篇博客就记录一下在 Flask 中怎么使用 Flask 的扩展库 flask-pagination 和分页插件 layPage 实现分页功能。html
首先你须要一个 Python 环境,而后须要安装几个第三方库:前端
使用以下命令进行安装:mysql
pip install flaskgit
pip install pymysqlgithub
pip install flask-paginationsql
pip install SQLAlchemy数据库
layui 是一个经典模块化前端 UI 框架,网址为:https://www.layui.com/,也能够直接点击这里进行下载。flask
layui 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用。其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从核心代码到 API 的每一处细节都通过精心雕琢,很是适合界面的快速开发。前端框架
此次使用的数据库是 MySQL,建了一个表 students,这个表只有两个字段:stu_id 和 stu_name,表中数据以下:
要使用 flask-pagination 来进行分页,须要从中导出一个类 Pagination:
from flask_paginate import Pagination
下面是分页的代码:
1 @app.route('/index') 2 def index(limit=10): 3 sess = DBSession() 4 data = sess.query(t_students).all() 5 page = int(request.args.get("page", 1)) 6 start = (page - 1) * limit 7 end = page * limit if len(data) > page * limit else len(data) 8 paginate = Pagination(page=page, total=len(data)) 9 ret = sess.query(t_students).slice(start, end) 10 return render_template("index.html", data=ret, paginate=paginate)
其中 limit 表示每页显示的条数,page 表明页数,start 和 end 分别表示该页面显示的数据区间,而后实例化 Pagination 类。这里我只传入了两个参数:page 和 total(total 表明数据总条数),除了这两个参数,还能够传入其余参数,例如:
在代码中,我使用了 render_template 来渲染页面并返回数据,下面是前端中的核心代码:
1 <table> 2 <thead> 3 <tr> 4 <th>ID</th> 5 <th>NAME</th> 6 </tr> 7 </thead> 8 <tbody> 9 {% for i in data %} 10 <tr> 11 <td>{{ i.stu_id }}</td> 12 <td>{{ i.stu_name }}</td> 13 </tr> 14 {% endfor %} 15 </tbody> 16 </table> 17 {{ paginate.links }}
最终获得的结果以下:
能够看到使用 flask-pagination 获得的分页效果是比较简单的,但若是想要更好的效果,可使用一些前端框架来实现,例如 layui 中的分页插件 layPage。layPage 致力于提供极致的分页逻辑,既可轻松胜任异步分页,也可做为页面刷新式分页,能够在这里查看文档。
首先须要导入 layui.js 和 layui.css:
<script src="../static/layui.js"></script>
<link rel="stylesheet" href="../static/css/layui.css">
laypage 的使用很是简单,指向一个用于存放分页的容器,经过服务端获得一些初始值,便可完成分页渲染。例如:
1 <div> 2 <table> 3 <thead> 4 <tr> 5 <th></th> 6 <th>ID</th> 7 <th>NAME</th> 8 </tr> 9 </thead> 10 <tbody id="demoBody"></tbody> 11 </table> 12 <div id="demo"></div> 13 </div>
其中 demo 用于存放分页,demoBody 则用于显示数据内容。但要实现分页,还须要使用 laypage.render() 来渲染。在 laypage.render() 中,有一些核心参数:
这里使用 layPage 来显示分页内容,而具体数据内容则须要使用 JS 来加载,具体代码以下:
1 <script> 2 $(function () { 3 initPage(); 4 }); 5 6 function initPage(pageConf) { 7 if (!pageConf) { 8 pageConf = {}; 9 pageConf.pageSize = 10; 10 pageConf.currentPage = 1; 11 } 12 $.post("http://127.0.0.1:5000/get_data", pageConf, function (data) { 13 layui.use(['laypage', 'layer'], function () { 14 var page = layui.laypage; 15 page.render({ 16 elem: 'demo', 17 count: data.count, 18 curr: pageConf.currentPage, 19 limit: pageConf.pageSize, 20 first: "首页", 21 last: "尾页", 22 layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'], 23 jump: function (obj, first) { 24 if (!first) { 25 pageConf.currentPage = obj.curr; 26 pageConf.pageSize = obj.limit; 27 initPage(pageConf); 28 } 29 } 30 }); 31 fillTable(data["data"], (pageConf.currentPage - 1) * pageConf.pageSize); //页面填充 32 }) 33 }); 34 } 35 36 //填充表格数据 37 function fillTable(data, num) { 38 $("#demoBody").html(''); 39 $.each(data, function (index, obj) { 40 // id 不少时候并非连续的,若是为了显示比较连续的记录数,能够这样根据当前页和每页条数动态的计算记录序号 41 index = index + num + 1; 42 var info = ''; 43 info += '<tr>'; 44 info += '<td>' + index + '</td>'; 45 info += '<td>' + obj.id + '</td>'; 46 info += '<td>' + obj.name + '</td>'; 47 info += '</tr>'; 48 $("#demoBody").append(info); 49 }); 50 } 51 </script>
前端代码完成了,还须要一个提供数据的接口,可使用 Flask 定义一个路由来实现,例如:
1 @app.route('/get_data', methods=['POST']) 2 def get_data(): 3 sess = DBSession() 4 data = sess.query(t_students).all() 5 limit = int(request.form.get("pageSize")) 6 page = int(request.form.get("currentPage")) 7 start = (page - 1) * limit 8 end = page * limit if len(data) > page * limit else len(data) 9 ret = [{"id": data[i].stu_id, "name": data[i].stu_name} for i in range(start, end)] 10 return {"data": ret, "count": len(data)}
前端使用了 POST 请求,传输的数据包括当前页数和每页显示条数,而后在 Flask 中使用 request.form.get() 来获取数据,获得页数和条数后取出相应区间中的数据,返回的结果是一个 JSON 格式数据,其中 data 表示数据,count 表示数据总条数。
最终获得的结果以下:
完整代码已上传到 GitHub!
原文出处:https://www.cnblogs.com/TM0831/p/12087966.html