Python利用flask sqlalchemy实现分页效果


Posted in Python onAugust 02, 2020

Flask-sqlalchemy是关于flask一个针对数据库管理的。文中我们采用一个关于员工显示例子。

首先,我们创建SQLALCHEMY对像db。

from flask import Flask, render_template,request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__,static_url_path='')
app.debug = True
app.secret_key = "faefasdfaf"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/personal.db' # app的配置,指定数据库路径
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = True 

db = SQLAlchemy(app)

然后我们利用db创建员工表:

from datetime import datetime

class Employee(db.Model):
 '''员工'''
 __tablename__ = 'employee'

 id = db.Column(db.Integer, primary_key=True)
 name = db.Column(db.String(50))
 gender = db.Column(db.String)
 job = db.Column(db.String)
 birthday = db.Column(db.DateTime)
 idcard = db.Column(db.String)
 address = db.Column(db.String)
 salary = db.Column(db.String)
 release_time = db.Column(db.DateTime)

 def __init__(self, name, gender, job, birthday, idcard, address, salary, release_time=None):
  self.name = name
  self.gender = gender
  self.job = job
  self.birthday = birthday
  self.idcard = idcard
  self.address = address
  self.salary = salary
  self.release_time = release_time if release_time else datetime.now()

 def __repr__(self):
  return '<员工{},{},{},{}>'.format(self.id, self.name, self.salary, self.address)

表创建好之后,我们可以从表中查询数据了。

from flask import render_template
from flask.views import MethodView
class EmployeeListView(MethodView): # 获取员工信息
 def get(self,page=1):
  employees = Employee.query.paginate(page,per_page=10)
  return render_template('employeelist.html', employees=employees)

以上我们通过查询,查询出员工信息,然后传给前台一个模板。(以上我们采用了flask的蓝图进行了分模块,假设我们把上面这个定义为视图函数为:employee.list)

注:paginate是分页的方法,第一个参数是页码,第二个是每页显示多少条。但是这样得到的结果不是一列表,需要在传到前台的值加一个 .items,下面举例说明。(利用jinja2模板)

 {% for item in employees.items %}

如上所示,在利用Jinja2去取值时,需要在后台传过来的值后面,加上.items。

继续上面的分页,这里我们要再次利用jinja2模板来定义一个方法,以实现分页的功能,这个页面名字就叫:helper.html。

{% macro render_page_data(page_data,page_function) %}
 <div class="text-center">
  <ul class="page_data">
   <li><a href="{{ url_for(page_function,page = 1) }}">首页</a></li>
   {% if page_data.has_prev %}
    <li><a href="{{ url_for(page_function,page = page_data.prev_num) }}">«</a></li>
   {% endif %}
   {% for page in page_data.iter_pages() %}
    {% if page %}
     {% if page !=page_data.page %}
      <li><a href="{{ url_for(page_function,page = page) }}">{{ page }}</a></li>
     {% else %}
      <li class="active"><a href="#">{{ page }}</a></li>
     {% endif %}
    {% endif %}
   {% endfor %}
   {% if page_data.has_next %}
    <li><a href="{{ url_for(page_function,page = page_data.next_num) }}">»</a></li>
   {% endif %}
   <li><a href="{{ url_for(page_function,page = page_data.pages) }}">末页</a></li>
  </ul>
 </div>
{% endmacro %}

以上是我们利用jinja2的语法定义了一个分布的方法,这个方法,我们传了二个参数,第一个是后台传过来通过db分页查询出来的数据。第二个是我们查询的数据的方法。

这里需要特别说明一下,分页的数据有几个重要的方法:

  • has_next:如果在目前页后至少还有一页的话,返回 True
  • has_prev:如果在目前页之前至少还有一页的话,返回 True
  • next_num:下一页的页面数
  • prev_num:前一页的页面数

通过上面的工作之后,最后就只差一步了,我们需要在我们的模板页通过Jinja2导入我们刚刚定义的方法,也就是在上面我们的employeelist.html中导入。

{% import 'helper.html' as helper %}

导入之后,我们就可以在我们需要的地方调用就可以了。

{{ helper.render_pagination(employees,'employee.list') }}

上面就是我们调用我们之前定义的方法。第一个参数,我们从后台传过来的值,第二个就是后台的那个视图函数。

进行了以上操作后,我们就大功告成了,下面看一下,我们实现了的效果图。

Python利用flask sqlalchemy实现分页效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python的Flask框架实现视频的流媒体传输
Mar 31 Python
Python实现国外赌场热门游戏Craps(双骰子)
Mar 31 Python
Python 遍历子文件和所有子文件夹的代码实例
Dec 21 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
浅谈python 中类属性共享的问题
Jul 02 Python
python队列原理及实现方法示例
Nov 27 Python
基于pycharm实现批量修改变量名
Jun 02 Python
Python爬虫抓取指定网页图片代码实例
Jul 24 Python
python代码能做成软件吗
Jul 24 Python
Python实现发送QQ邮件的封装
Jul 14 #Python
python记录程序运行时间的三种方法
Jul 14 #Python
python运行其他程序的实现方法
Jul 14 #Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 #Python
Python学习教程之常用的内置函数大全
Jul 14 #Python
python与C互相调用的方法详解
Jul 14 #Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 #Python
You might like
php 动态多文件上传
2009/01/18 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
什么是岗位职责
2013/11/12 职场文书
旷课检讨书2000字
2014/01/14 职场文书
对教师的评语
2014/04/28 职场文书
我的中国心演讲稿
2014/09/04 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
公司处罚决定书
2015/06/24 职场文书
中学总务处工作总结
2015/08/12 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技
python区块链持久化和命令行接口实现简版
2022/05/25 Python