LogoLogo
  • README
  • 前端编程
    • 01 Node JS
    • 02-ES6详解
    • 03-NPM详解
    • 04-Babel详解
    • 05-前端模块化开发
    • 06-WebPack详解
    • 07-Vue详解
    • 08-Git详解
    • 09-微信小程序
  • 人工智能
    • 机器学习
      • 二次分配问题
      • 非负矩阵
      • 概率潜在语义分析
      • 概率图模型
      • 集成学习
      • 降维
      • 距离度量
      • 决策树
      • 逻辑回归
      • 马尔可夫决策过程
      • 马尔可夫链蒙特卡洛法
      • 朴素贝叶斯法
      • 谱聚类
      • 奇异值分解
      • 潜在狄利克雷分配
      • 潜在语义分析
      • 强化学习
      • 社区算法
      • 时间序列模型
      • 特征工程
      • 条件随机场
      • 图论基础
      • 线性分类
      • 线性回归
      • 信息论中的熵
      • 隐马尔科夫模型
      • 支持向量机
      • 主成分分析
      • EM算法
      • Hermite 矩阵的特征值不等式
      • k-means聚类
      • k近邻法
      • PageRank算法
    • 深度学习
      • Pytorch篇
        • 01-线性模型
        • 02-梯度下降法
        • 03-反向传播
        • 04-pytorch入门
        • 05-用pytorch实现线性回归
        • 06-logistic回归
        • 07-处理多维特征的输入
        • 08-加载数据集
        • 09-多分类问题
        • 10-卷积神经网络
        • 11-循环神经网络
    • 图神经网络
      • 图神经网络笔记01
        • 01-图(Graphs)的结构
        • 02-网络的性质和随机图模型
        • 03-网络工具
        • 04-网络中的主题和结构角色
        • 05-网络中的社区结构
      • 图神经网络笔记02
        • 01-深度学习引言
        • 02-神经网络基础
        • 03-卷积神经网络
        • 04-图信号处理与图卷积神经网络
        • 05-GNN的变体与框架-
        • [06-Google PPRGo 两分钟分类千万节点的最快GNN](人工智能/图神经网络/图神经网络笔记02/06-Google%20PPRGo 两分钟分类千万节点的最快GNN.md)
        • 07-序列模型
        • 08-变分自编码器
        • 09-对抗生成网络
  • 日常记录
    • 健身日记
    • 面经记录
    • 自动生成Summary文件
  • 实战项目
    • 谷粒商城
      • 00-项目概述
      • 01-分布式基础-全栈开发篇
      • 02-分布式高级-微服务架构篇
      • 03-高可用集群-架构师提升篇
  • 数据库
    • MySQL笔记
      • 01-MySQL基础篇
      • 02-MySQL架构篇
      • 03-MySQL索引及调优篇
      • 04-MySQL事务篇
      • 05-MySQL日志与备份篇
    • Redis笔记
      • 01-Redis基础篇
      • 02-Redis高级篇
    • 02-Redis篇
  • 算法笔记
    • 01-算法基础篇
    • 02-算法刷题篇
  • 职能扩展
    • 产品运营篇
  • Go编程
    • 01-Go基础
      • 01-Go基础篇
  • Java编程
    • 01-Java基础
      • 01-Java基础篇
      • 02-多线程篇
      • 03-注射与反解篇
      • 04-JUC并发编程篇
      • 05-JUC并发编程与源码分析
      • 06-JVM原理篇
      • 07-Netty原理篇
      • 08-设计模式篇
    • 02 Java Web
      • 01-Mybatis篇
      • 01-Mybatis篇(新版)
      • 02-Spring篇
      • 02-Spring篇(新版)
      • 03-SpringMVC篇
      • 04-MybatisPlus篇
    • 03-Java微服务
      • 01-SpringBoot篇
      • 01-SpringBoot篇(新版)
      • 02-SpringSecurity篇
      • 03-Shiro篇
      • 04-Swagger篇
      • 05-Zookeeper篇
      • 06-Dubbo篇
      • 07-SpringCloud篇
      • 08-SpringAlibaba篇
      • 09-SpringCloud篇(新版)
    • 04-Java中间件
      • 数据库篇
        • 01-分库分表概述
        • 02-MyCat篇
        • 03-MyCat2篇
        • 04-Sharding-jdbc篇
        • 05-ElasticSearch篇
      • 消息中间件篇
        • 01-MQ概述
        • 02-RabbitMQ篇
        • 03-Kafka篇
        • 04-RocketMQ篇
        • 05-Pulsar篇
    • 05-扩展篇
      • Dubbo篇
      • SpringBoot篇
      • SpringCloud篇
    • 06-第三方技术
      • 01-CDN技术篇
      • 02-POI技术篇
      • 03-第三方支付技术篇
      • 04-第三方登录技术篇
      • 05-第三方短信接入篇
      • 06-视频点播技术篇
      • 07-视频直播技术篇
    • 07-云原生
      • 01-Docker篇
      • 02-Kubernetes篇
      • 03-Kubesphere篇
  • Linux运维
    • 01-Linux篇
    • 02-Nginx篇
  • Python编程
    • 01-Python基础
      • 01.配置环境
      • 02.流程控制
      • 03.数值
      • 04.操作符
      • 05.列表
      • 06.元祖
      • 07.集合
      • 08.字典
      • 09.复制
      • 10.字符串
      • 11.函数
      • 12.常见内置函数
      • 13.变量
      • 14.异常和语法错误
      • 15.时间和日期
      • 16.正则表达式
    • 02 Python Web
      • flask篇
        • 01.前言
        • 02.路由
        • 03.模板
        • 04.视图进阶
        • 05.flask-sqlalchemy
        • 06.表单WTForms
        • 07.session与cookie
        • 08.上下文
        • 09.钩子函数
        • 10.flask 信号
        • 11.RESTFUL
        • 13.flask-mail
        • 14.flask+celery
        • 15.部署
        • 16.flask-login
        • 17.flask-cache
        • 18.flask-babel
        • 19.flask-dashed
        • 20.flask-pjax
        • 21.flask上传文件到第三方
        • 22.flask-restless
        • 23.flask-redis
        • 24.flask-flash
        • 25.消息通知
        • 26.分页
    • 03-Python数据分析
      • Matplotlib
      • Numpy
      • Pandas
      • Seaborn
    • 04-Python爬虫
      • 1.准备工作
      • 2.请求模块的使用
      • 3.解析模块的使用
      • 4.数据存储
      • 5.识别验证码
      • 6.爬取APP
      • 7.爬虫框架
      • 8.分布式爬虫
由 GitBook 提供支持
在本页
  • 论述
  • 创建数据库
  • 配置数据库
  • 定义模型
  • 创建数据
  • 分页操作
  • flask-sqlalchemy的分页功能
  • 通过flask-pagination进行分页

这有帮助吗?

在GitHub上编辑
  1. Python编程
  2. 02 Python Web
  3. flask篇

26.分页

上一页25.消息通知下一页03-Python数据分析

最后更新于3年前

这有帮助吗?

论述

flask通过flask-sqlalchemy建立模型后,将数据库的数据查询出来传递到模板中,由于有时候数据很多,需要进行分页查询,自己动手写一个分页很麻烦。可以通过flask-sqlalchemy自带的分页功能或者flask-pagination、flask-pagninate等插件进行分页。

创建数据库

create database pagination charset=utf8;
image-20200915130950146

配置数据库

from flask import Flask,render_template,request
from flask_sqlalchemy import SQLAlchemy

HOSTNAME = "127.0.0.1"
PORT = "3306"
DATABASE = "pagination"
USERNAME = "root"
PASSWORD = "123456"
DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
# 屏蔽SQLalchemy发送的信号
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db = SQLAlchemy()
db.init_app(app)

定义模型

class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(200),)
    age = db.Column(db.Integer,)

创建数据

通过python shell进行交互创建数据

from app import *
db.create_all()

如果出现如下错误

'No application found. Either work inside a view function or push'。。。

则应该这样写

db.create_all(app=app)

接下来进行创建数据

from app import *

with app.app_context():
    for i in range(1000):
        user = UserModel(name="user{}".format(i),age=i%100)
        db.session.add(user)
    db.session.commit()

查看数据从第10行开始的10条数据

分页操作

flask-sqlalchemy的分页功能

通过flask-sqlalchemy自带的分页功能进行分页

定义视图函数

@app.route('/')
def index():
    # 获取页码,page是分页操作中默认的参数
    page = request.args.get("page",default=1,type=int)
    # 获取sqlalchemy对象
    objs = UserModel.query.order_by(UserModel.name.desc())
    # 获取pagination对象
    pagination = objs.paginate(page, per_page=10, error_out = False)
    # 通过pagination对象的items方法返回当前页的内容列表
    users = pagination.items

	# pagination对象能够进行分页
    data = {
        "users":users,
        "pagination":pagination,
    }
    
    return render_template("index.html",**data)

pagination对象常用方法

参数
用法

has_next

是否还有下一页

has_prev

是否还有上一页

items

返回当前页的所有内容

next(error_out=False)

返回下一页的Pagination对象

prev(error_out=False)

返回上一页的Pagination对象

page

当前页的页码(从1开始)

pages

总页数

per_page

每页显示的数量

prev_num

上一页页码数

next_num

下一页页码数

query

返回创建的Pagination对象的查询对象

total

查询返回的记录总数

iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2)

迭代分页中的页码,四个参数,分别控制了省略号左右两侧各显示多少页码,在模板中可以这样渲染

定义模板

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div data-gb-custom-block data-tag="for">

{{ item.name }} -- {{ item.age }} <br>

</div>

<div data-gb-custom-block data-tag="set" data-endpoint='index'></div>

<ul class="pagination">
{#    没有前一页,添加class=disble,不可点击,a href=##}
    <li

<div data-gb-custom-block data-tag="if"> class="disabled"</div>>
        <a href="<div data-gb-custom-block data-tag="if"></div>{{ url_for(endpoint, page=pagination.prev_num)}}<div data-gb-custom-block data-tag="else">#</div>">
            &laquo;
        </a>
    </li>
    <div data-gb-custom-block data-tag="for"></div>

        

<div data-gb-custom-block data-tag="if"></div>

            

<div data-gb-custom-block data-tag="if">

            <li class="active">
                <a href="{{ url_for(endpoint, page = p)}}">{{ p }}</a>
            </li>
            

<div data-gb-custom-block data-tag="else">

            <li>
                <a href="{{ url_for(endpoint, page = p) }}">{{ p }}</a>
            </li>
            

</div>

        

<div data-gb-custom-block data-tag="else">

        <li class="disabled"><a href="#">&hellip;</a></li>
        

</div>

    

</div>

{#    没有后一页,添加class=disble,不可点击,a href=##}
    <li

<div data-gb-custom-block data-tag="if"> class="disabled"</div>>
        <a href="<div data-gb-custom-block data-tag="if"></div>{{ url_for(endpoint, page=pagination.next_num) }}<div data-gb-custom-block data-tag="else">#</div>

">
            &raquo;
        </a>
    </li>
</ul>
</body>
</html>

可以将分页的部分抽离出来放在macro模板中,这样其他页面需要分页的时候,就能直接调用时候了,不用在写一次了。

_macro.html

<div data-gb-custom-block data-tag="macro"></div>

<ul class="pagination">
{#    没有前一页,添加class=disble,不可点击,a href=##}
    <li

<div data-gb-custom-block data-tag="if"> class="disabled"</div>>
        <a href="<div data-gb-custom-block data-tag="if"></div>{{ url_for(endpoint, page=pagination.prev_num)}}<div data-gb-custom-block data-tag="else">#</div>">
            &laquo;
        </a>
    </li>
    <div data-gb-custom-block data-tag="for"></div>

        

<div data-gb-custom-block data-tag="if"></div>

            

<div data-gb-custom-block data-tag="if">

            <li class="active">
                <a href="{{ url_for(endpoint, page = p)}}">{{ p }}</a>
            </li>
            

<div data-gb-custom-block data-tag="else">

            <li>
                <a href="{{ url_for(endpoint, page = p) }}">{{ p }}</a>
            </li>
            

</div>

        

<div data-gb-custom-block data-tag="else">

        <li class="disabled"><a href="#">&hellip;</a></li>
        

</div>

    

</div>

{#    没有后一页,添加class=disble,不可点击,a href=##}
    <li

<div data-gb-custom-block data-tag="if"> class="disabled"</div>>
        <a href="<div data-gb-custom-block data-tag="if">{{ url_for(endpoint, page=pagination.next_num) }}<div data-gb-custom-block data-tag="else">#</div>

">
            &raquo;
        </a>
    </li>
</ul>

</div>

index.html

<div data-gb-custom-block data-tag="import" data-0='_macro.html'></div>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div data-gb-custom-block data-tag="for">

{{ item.name }} -- {{ item.age }} <br>

</div>

{{ macros.render_pagination(pagination=pagination,endpoint="index") }}

</body>
</html>

通过flask-pagination进行分页

安装

pip install flask-paginate

导入模块

from flask_paginate import Pagination,get_page_parameter
  • get_page_parameter() 这个默认值为 page, 也就是分页编号, 表示当前是第几页

定义视图函数

@app.route('/')
def index(per_page=10):
    # 获取页码,page是分页操作中默认的参数
    page = request.args.get(get_page_parameter(),type=int,default=1)

    offset = (page-1)*per_page
    count = offset + per_page

    # 获取sqlalchemy对象
    objs = UserModel.query
    """
    objs = UserModel.query.all()[offset:count]
    """

    # 用户数据
    users = objs.offset(offset).limit(per_page).all()

    # 获取总数
    total = objs.count()
    # 获取pagination对象
    pagination = Pagination(bs_version=3, page=page, total=total, outer_window=0, inner_window=2)

    data = {
        "users":users,
        "pagination":pagination,
    }
    return render_template("index.html",**data)

Pagination(bs_version=3, page=page, total=total, outer_window=0, inner_window=2)中需要添加outer_window=0, inner_window=2这样能够渲染按钮。

pagination对象常用方法

参数
说明

Pagination(page=,total=,bs_version=,search=,record_name=,outer_window=,inner_window=)

page= 当前是第几页; total= 数据总量; bs_version= 这个就是 bootstrap 的版本号了, 默认值是2 ;search= 是否是搜索, pagination.info 格式化时文案会不一样 ;record_name= 展示文案 pagination.info 中的值;设置outer_window,inner_window能够渲染按钮

links

一组可点击的分页页码的展示

info

分页数据总量的展示

更改CSS样式

可以根据需求调整

.pagination-page-info {
    padding: .6em;
    padding-left: 0;
    width: 40em;
    margin: .5em;
    margin-left: 0;
    font-size: 12px;
}
.pagination-page-info b {
    color: black;
    background: #6aa6ed;
    padding-left: 2px;
    padding: .1em .25em;
    font-size: 150%;
}

定义模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<body>

<div data-gb-custom-block data-tag="for">

{{ user.name }} -- {{ user.age }} <br>

</div>
{{ pagination.info }}
{{ pagination.links }}
</body>
</html>
image-20200915131548538
image-20200915134650429
image-20200915134821028
image-20200915143750693