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图像处理之镜像实现方法
May 30 Python
Python简明入门教程
Aug 04 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
python字符串与url编码的转换实例
May 10 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
python利用opencv实现颜色检测
Feb 23 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可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
解析php中反射的应用
2013/06/18 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
php实现微信支付之退款功能
2018/05/30 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
python读文件的步骤
2019/10/08 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
银行实习生自我鉴定范文
2013/09/19 职场文书
优秀员工表扬信
2014/01/17 职场文书
员工生日会策划方案
2014/06/14 职场文书
关爱残疾人标语
2014/06/25 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
员工自我工作评价
2015/03/06 职场文书
文化大革命观后感
2015/06/17 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js