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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
解密Python中的描述符(descriptor)
Jun 03 Python
玩转python爬虫之URLError异常处理
Feb 17 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
python3.6实现学生信息管理系统
Feb 21 Python
Python中print和return的作用及区别解析
May 05 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
python如何导入依赖包
Jul 13 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 Python
python将图片转为矢量图的方法步骤
Mar 30 Python
python中的sys模块和os模块
Mar 20 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语法(5)
2006/10/09 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
Vuex实现数据共享的方法
2019/12/20 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
Django 前后台的数据传递的方法
2017/08/08 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
Python有参函数使用代码实例
2020/01/06 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
python 如何上传包到pypi
2020/12/24 Python
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
全球工业:Global Industrial
2020/02/01 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
班会关于环保演讲稿
2013/12/29 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
合作协议书模板2014
2014/09/26 职场文书
招商引资工作汇报
2014/10/28 职场文书
2014年收银工作总结
2014/11/13 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python