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读大数据txt
Mar 28 Python
Python中int()函数的用法浅析
Oct 17 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
python浪漫表白源码
Apr 05 Python
简单了解Python3里的一些新特性
Jul 13 Python
Django 开发环境配置过程详解
Jul 18 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
Python程序暂停的正常处理方法
Nov 07 Python
tensorflow多维张量计算实例
Feb 11 Python
使用anaconda安装pytorch的实现步骤
Sep 03 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图片上传类带图片显示
2006/11/25 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
使用jquery实现简单的ajax
2013/07/08 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
原生js实现轮播图
2017/02/27 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
Vue infinite update loop的问题解决
2019/04/23 Javascript
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
初中政治教学反思
2014/01/17 职场文书
应届护士求职信范文
2014/01/26 职场文书
粗加工管理制度
2014/02/04 职场文书
优秀家长自荐材料
2014/08/26 职场文书
2015入党自传书范文
2015/06/26 职场文书
创业计划书之酒吧
2019/12/02 职场文书
MySQL分库分表详情
2021/09/25 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL
Golang 遍历二叉树
2022/04/19 Golang