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 获取本机ip地址的两个方法
Feb 25 Python
python实现的文件夹清理程序分享
Nov 22 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 Python
详解Python pygame安装过程笔记
Jun 05 Python
Python3 Random模块代码详解
Dec 04 Python
Python Socket编程之多线程聊天室
Jul 28 Python
Python多进程fork()函数详解
Feb 22 Python
Python time库基本使用方法分析
Dec 13 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
在python里创建一个任务(Task)实例
Apr 25 Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 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 define函数的使用说明
2008/08/27 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
勤俭节约倡议书
2014/04/14 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
员工安全生产责任书
2014/07/22 职场文书
平安工地汇报材料
2014/08/19 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
十二生肖观后感
2015/06/12 职场文书
《穷人》教学反思
2016/02/19 职场文书
解决redis批量删除key值的问题
2022/03/23 Redis