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每次处理固定个数的字符的方法总结
Jan 29 Python
使用python获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
python根据日期返回星期几的方法
Jul 06 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
python数据处理实战(必看篇)
Jun 11 Python
Python生成数字图片代码分享
Oct 31 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
Python数组拼接np.concatenate实现过程
Apr 18 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 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多线程异步请求的3种方法
2014/01/17 PHP
php简单获取目录列表的方法
2015/03/24 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
vue 中几种传值方法(3种)
2019/11/12 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
python采集博客中上传的QQ截图文件
2014/07/18 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
副总经理岗位职责范本
2014/09/30 职场文书
优秀教师个人总结
2015/02/11 职场文书
会计做账心得体会
2016/01/22 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL