Flask如何分页显示数据库?,有哪些方法?

核心结论

Flask分页显示数据库的推荐方案是使用Flask-SQLAlchemy自带的paginate()方法,它通过接收当前页码和每页数量返回一个Pagination对象,自动处理OFFSET和LIMIT逻辑,并提供当前页数据、总页数、前后页链接等属性,无需手动拼接SQL即可快速实现分页显示。参考2

分页实现基础:三步搭建核心逻辑

安装与模型准备

首先确保项目中已安装Flask-SQLAlchemy,在虚拟环境中执行:

Flask编程进阶:SQLite数据列表分页查询的绝佳方法
加载中
Flask编程进阶:SQLite数据列表分页查询的绝佳方法
pip install flask-sqlalchemy

假设我们有一个用户表,模型定义如下:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    email = db.Column(db.String(100))

视图函数中的分页调用

在路由视图函数中,需要从请求参数中获取页码(page)和每页数量(per_page),然后对模型进行分页查询,核心代码:

from flask import request, render_template
@app.route('/users')
def users():
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 10, type=int)
    pagination = User.query.paginate(page=page, per_page=per_page, error_out=False)
    users = pagination.items
    return render_template('users.html', pagination=pagination, users=users)
  • page:当前页码,从查询字符串获取,默认第1页。
  • per_page:每页显示条数,默认10条。
  • error_out=False:当页码超出范围时不报错,返回空列表,便于前端处理。
  • pagination.items:当前页的数据列表。

模板中的分页导航

在模板中,需要显示数据列表和分页导航链接,以下是一个常见的分页导航片段:参考2

<table>
    {% for user in users %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.email }}</td>
    </tr>
    {% endfor %}
</table>
<div class="pagination">
    {% if pagination.has_prev %}
        <a href="{{ url_for('users', page=pagination.prev_num) }}">上一页</a>
    {% endif %}
    {% for page_num in pagination.iter_pages() %}
        {% if page_num %}
            <a href="{{ ur

Flask如何分页显示数据库?,有哪些方法?

l_for('users', page=page_num) }}" class="{{ 'active' if page_num == pagination.page else '' }}"> {{ page_num }} </a> {% else %} <span>...</span> {% endif %} {% endfor %} {% if pagination.has_next %} <a href="{{ url_for('users', page=pagination.next_num) }}">下一页</a> {% endif %} </div>
  • pagination.has_prev / has_next:判断是否有上一页/下一页。
  • pagination.prev_num / next_num:上一页/下一页的页码。
  • pagination.iter_pages():生成分页页码列表,中间页码用……替代。

代码实战:从模型到模板的完整示例

分页参数详解

paginate()返回的Pagination对象包含以下核心属性:

属性 类型 说明
items list 当前页的数据列表
total int 总记录数
pages int 总页数
page int 当前页码
per_page int 每页数量
has_prev bool 是否有上一页
has_next bool 是否有下一页
prev_num int 上一页的页码
next_num int 下一页的页码
iter_pages() 生成器 生成用于显示的页码序列

完整代码示例:博客文章列表分页

假设我们有一个Post模型,需要分页显示文章列表:

@app.route('/posts')
def posts():
    page = request.args.get('page', 1, type=int)
    per_page = 10
    pagination = Post.query.order_by(Post.created_at.desc()).paginate(
        page=page, per_page=per_page, error_out=False
    )
    posts = pagination.items
    return render_template('posts.html', pagination=pagination, posts=posts)

模板中展示文章标题和摘要,分页导航复用之前的代码,注意error_out=False,这样即使页码超出范围,也能正常渲染页面,只是数据为空。

Flask如何分页显示数据库?,有哪些方法?

处理不同场景下的分页参数

  • 搜索结合分页:在分页查询前先应用过滤条件,例如Post.query.filter(Post.title.contains(keyword)).paginate(...),同时需要将搜索关键词保留在分页链接中,通过url_for手动拼接参数。
  • 排序与分页:分页前务必先排序,否则分页结果可能不固定,使用order_by确保顺序一致。
  • 每页数量动态调整:可以从请求参数中获取per_page,但需要做合法性校验,防止用户传入过大值导致性能问题,通常设置上限,如per_page = min(per_page, 100)

性能优化与常见问题

大数据量下的分页性能

当数据量达到百万级时,传统的OFFSET分页效率会下降,因为数据库需要扫描并丢弃前N条记录,行业共识认为,对于这种场景有两种优化方向:

  • 键集分页(Keyset Pagination):通过上次查询的最后一条记录的某个字段(如ID)来定位下一页起点,避免扫描跳过的行,但实现相对复杂,且不支持随机跳页。
  • 增加缓存层:对分页结果进行缓存,减少重复查询,常用Redis缓存热点页。

对于大多数中小型应用(总记录数在几万以内),直接使用paginate()性能完全足够,无需过度优化。

常见错误与规避

  • 页码超出范围:设置error_out=False,让视图返回空列表而非404,前端可显示“没有更多数据”或隐藏分页控件。
  • 每页数量设置不当per_page不宜过大(如超过100),否则单次查询加载大量数据会拖慢页面加载速度,建议根据列表展示密度设置在10-30之间。
  • 分页导航显示不全:当总页数很多时,iter_pages()默认只生成左右各两页的链接,中间用None表示省略,如果希望显示更多页码,可以自定义iter_pages的参数,如pagination.iter_pages(left_edge=2, left_current=2, right_current=3, right_edge=2)
  • 分页链接中的参数丢失:在模板中生成分页链接时,除了page参数,还需要保留其他查询参数(如搜索词、排序字段),可以在url_for中传入request.args并覆盖

    Flask如何分页显示数据库?,有哪些方法?

    pageurl_for('posts', request.args, page=page_num)

分页方案对比:Flask与Django的异同

如果你从Django转向Flask,可能对分页的实现方式感到好奇,在Django中,分页使用Paginator类,与Flask-SQLAlchemy的paginate()非常相似,但有两个关键区别:

  • 查询对象:Flask的paginate()是直接绑定在查询对象上的方法,而Django需要先创建Paginator实例,再调用get_page()
  • 模板渲染:Django的Paginator对象提供了page_obj,属性命名与Flask略有不同(如has_previous vs has_prev),但整体设计思路一致,都是通过当前页对象获取数据列表和分页信息。

在性能上,两者底层均依赖数据库的LIMIT/OFFSET,没有本质差异,选择哪种框架取决于你的技术栈,而非分页功能本身。

Flask分页显示数据库的核心就是paginate()方法,它封装了分页所需的全部逻辑,从数据截取到导航信息生成,熟练掌握其参数(pageper_pageerror_out)和Pagination对象属性(itemspagesiter_pages()),即可在多数场景下快速实现清晰、高效的分页显示。

常见问题与解答

Flask分页显示数据库时如何获取总页数?

通过pagination.pages属性获取,它返回总页数(整数),例如pagination.pages的值就是总页数,可用于在模板中展示“共X页”。

Flask分页显示数据库如何自定义每页显示数量?

在调用paginate()时传入per_page参数,如User.query.paginate(page=1, per_page=20),也可以从请求参数中获取,例如request.args.get('per_page', 10, type=int),但需验证数值范围,防止恶意传入过大值导致性能问题。

Flask分页显示数据库在模板中如何生成页码链接?

使用url_for函数生成带page参数的链接,遍历pagination.iter_pages()返回的页码列表,如果是数字则生成链接,如果是None则显示省略号,同时利用pagination.has_prevpagination.has_next控制上一页/下一页的显示,并分别传入pagination.prev_numpagination.next_num作为页码。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://test.idctop.com/article/519563.html

(0)
服务器主机的磁盘控制器到底是什么,如何选择?
上一篇 2026年7月26日 02:15
服务器一键还原的正确操作步骤是什么,有哪些注意事项?
下一篇 2026年7月26日 02:27

相关推荐

  • AIoT教学实训平台是什么?AIoT教学实训平台有哪些

    AIoT教学实训平台通过整合硬件开发、云端连接与数据分析全流程,为高校及职业院校提供从基础认知到项目实战的一站式解决方案,有效解决传统教学中软硬件脱节、技术迭代滞后及实训资源匮乏的核心痛点,物联网技术正以前所未有的速度渗透进教育领域,但许多学校在面对AIoT(人工智能物联网)课程改革时,往往陷入“买设备贵、组网……

    程序开发 2026年6月12日
    3100
  • Windows蓝牙开发怎么做?Windows蓝牙编程教程

    Windows平台下的蓝牙应用开发,核心结论在于准确选择技术栈并妥善处理底层硬件抽象层(HAL)的复杂性,对于绝大多数开发者而言,Windows Runtime (WinRT) API 已取代传统的 Bluetooth Socket 模式,成为现代 Windows 蓝牙开发的首选方案,它提供了从设备发现、配对到……

    2026年4月3日
    9400
  • Excel行累加如何实现?,Excel行累加怎么操作

    Excel行累加的本质是SUM族函数配合绝对引用与快捷键的灵活运用,掌握自动求和Alt+=、SUBTOTAL动态汇总以及数据透视表行汇总这三板斧,就能在日常报表中实现零错误的横向累加,Excel行累加怎么操作?三种方法可直接套用操作行累加前先明确需求:是简单连续单元格求和,还是受筛选影响的可见行求和,或者是多表……

    程序开发 2026年7月17日
    2800
  • NovixLink洛杉矶NTT双ISP VPS好用吗?美国VPS推荐

    NovixLink洛杉矶NTT双ISP住宅IP VPS已正式上线,凭借192小众号段及9929/CMIN2三网优化,月付低至约34元起,是低成本获取高质量美国住宅IP的优选方案,在跨境电商、社媒运营以及数据抓取领域,IP地址的质量直接决定了业务的安全性与效率,传统的机房IP往往因为被标记为数据中心而面临封号风险……

    2026年7月8日
    5500
  • 如何在ASP.NET小孔子CMS中添加修改数据 | 详细教程步骤解析

    在ASP.NET小孔子CMS中,高效、准确且安全地进行数据的添加(Create)与修改(Update)操作,是内容管理的核心任务,也是网站活力的源泉,掌握其内在机制和最佳实践,能显著提升网站运营效率和内容质量,以下是深入解析与专业指导: 数据添加(Create):构建内容基石数据添加是将新记录插入数据库的过程……

    2026年2月11日
    13500
  • 补货VPS测评日本大带宽实测数据65.38美元/年性能对比,日本VPS哪个性价比高,VPS测评

    补货 VPS 实测结论:日本大带宽节点在 2026 年 65.38 美元/年的定价下,凭借 10Gbps 独享上行与 99.9% 线路稳定性,成为国内用户进行海外业务部署的高性价比首选方案,其综合性能优于同价位欧美节点,在 2026 年云计算市场格局重塑的背景下,补货 VPS 测评:日本大带宽实测数据,65.3……

    2026年5月10日
    5000
  • 云服务器价格为何波动?云服务器价格走势分析

    云服务器价格走势分析在数字化转型的浪潮中,计算资源已成为企业核心竞争力的基石,面对市场上琳琅满目的云服务商和瞬息万变的定价策略,如何精准把握云服务器价格走势,并在保证性能稳定性的前提下实现成本最优,是每一位技术决策者必须面对的课题,本文基于2026年的市场数据与实测体验,深入剖析当前云服务器的价格逻辑、性能表现……

    2026年7月7日
    6710
  • 软件开发自学软件有哪些?零基础入门必看指南

    在数字化转型的浪潮下,掌握软件开发技能已成为提升个人竞争力的关键路径,对于初学者而言,核心结论非常明确:自学软件开发是一条可行且高效的道路,但成功的关键在于选对工具、规划路径并坚持实践,面对海量的技术资源,筛选出适合自学的软件与开发方向,能极大缩短从入门到就业的距离,自学软件开发不仅仅是学习编程语法,更是利用现……

    2026年3月19日
    12600
  • 服务器2008R2密码忘了怎么办?,如何找回密码?

    服务器2008R2开机密码忘了怎么办?最直接有效的解决方法是使用Windows PE启动盘或第三方密码重置工具,通过修改SAM文件来清除密码,整个过程无需重装系统,也不会丢失数据,如果你正在面对这台老服务器的登录界面,别着急,下面我会从实际运维角度,带你一步步找回控制权,无论是接手前人的遗留问题,还是自己遗忘密……

    2026年8月23日
    100
  • 三星s7怎么打开开发者选项?三星s7开发者选项开启方法

    三星 S7 开发者选项:精准解锁系统潜能的实战指南三星 S7 作为 2016 年旗舰机型,虽已退出主流市场,但其硬件稳定、系统可塑性强,仍被大量开发者与技术爱好者用于测试、学习与定制,开发者选项是 Android 系统底层调控的核心入口,正确启用并配置三星 S7 的开发者选项,可显著提升调试效率、性能调优与问题……

    程序开发 2026年4月16日
    8600

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注