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中的偏函数
Apr 27 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
用pandas按列合并两个文件的实例
Apr 12 Python
python在文本开头插入一行的实例
May 02 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
Python @property及getter setter原理详解
Mar 31 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
Apr 06 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 Undefined index报错的修复方法
2011/07/17 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
取得父标签
2006/11/14 Javascript
另类调用flash无须激活的方法
2006/12/27 Javascript
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
JavaScript toFixed() 方法
2010/04/15 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
python绘制高斯曲线
2021/02/19 Python
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
建筑班组长岗位职责
2014/01/02 职场文书
三爱活动实施方案
2014/03/19 职场文书
初三语文教学计划
2015/01/22 职场文书
2015教师节通讯稿
2015/07/20 职场文书
Django与数据库交互的实现
2021/06/03 Python