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如何分页显示数据库?,有哪些方法?

    page,url_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()方法,它封装了分页所需的全部逻辑,从数据截取到导航信息生成,熟练掌握其参数(page、per_page、error_out)和Pagination对象属性(items、pages、iter_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_prev和pagination.has_next控制上一页/下一页的显示,并分别传入pagination.prev_num和pagination.next_num作为页码。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/flask%e5%a6%82%e4%bd%95%e5%88%86%e9%a1%b5%e6%98%be%e7%a4%ba%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%9f%ef%bc%8c%e6%9c%89%e5%93%aa%e4%ba%9b%e6%96%b9%e6%b3%95%ef%bc%9f/

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

相关推荐

  • 高德地图开发api怎么用?高德地图api接入教程

    高德地图开发API的核心价值在于其强大的地理位置服务能力与灵活的定制化扩展功能,能够帮助开发者以最低的成本构建专业级的LBS(基于位置的服务)应用,对于企业级应用开发而言,选择高德地图开发API不仅能解决基础的地图展示问题,更能在路径规划、大数据可视化、精准定位等深层业务场景中提供关键支撑,是连接物理世界与数字……

    2026年3月11日
    17500
  • 如何用Java连接两个MySQL数据库?,怎么上传驱动

    在Java应用中同时连接两个MySQL数据库,核心在于合理配置多数据源并确保MySQL JDBC驱动正确上载至项目依赖中,为什么需要连接两个MySQL数据库多数业务场景下,单一数据库就能满足需求,但涉及数据隔离、读写分离或者跨系统数据交互时,双数据库连接就成了刚需,典型业务场景举例一个项目同时访问业务数据库和日……

    2026年8月2日
    900
  • win10适合用什么开发语言?win10编程语言选择指南

    在Windows 10环境下进行软件开发,选择合适的编程语言直接决定了开发效率、软件性能以及最终的用户体验,核心结论是:C# 与 .NET 框架是构建原生Windows应用的首选,C++ 依然是高性能底层开发的霸主,而 Python 和 JavaScript 则在跨平台与Web开发领域占据重要地位, 开发者应根……

    2026年3月31日
    9800
  • iOS开发中的标签功能如何实现?如何实现,iOS开发中的标签功能

    iOS开发中的标签:构建清晰高效的信息展示在iOS应用界面设计中,标签是传递核心信息、提升用户认知效率的关键组件,无论是商品价格、状态提示还是简短描述,合理运用标签能显著提升用户体验,本文将深入iOS标签开发的核心技术与最佳实践,基础构建:UIKit与SwiftUI双视角1 UIKit 方案:UILabel 的……

    2026年2月16日
    22800
  • 企业云服务器防火墙怎么设置?服务器安全策略配置详解

    关于企业云服务器防火墙的设置在数字化转型的深水区,企业数据资产的安全防护已不再是IT部门的附加选项,而是业务连续性的生命线,随着勒索软件、DDoS攻击以及零日漏洞利用手段的日益复杂化,传统的边界防御体系正面临严峻挑战,对于部署在公有云或混合云架构下的企业而言,云服务器防火墙(Cloud Firewall) 不仅……

    2026年6月3日
    4000
  • 重庆中心开发商是谁?重庆中心开发商靠谱吗?

    重庆中心作为城市核心地标项目,其开发商的综合实力直接决定了项目的品质与价值,选择具备雄厚资金背景、丰富地标打造经验及长期运营能力的开发商,是保障投资安全与居住体验的核心关键,在重庆“两江四岸”核心区提升战略背景下,开发商不仅承担着建筑建造者的角色,更是城市界面的更新者与生活方式的运营商, 核心结论:开发商实力决……

    2026年3月20日
    10400
  • 个人网站真的需要云数据库吗?个人网站搭建必备数据库方案

    在构建个人网站或小型应用时,许多开发者和技术爱好者都会面临一个核心架构抉择:个人网站需要云数据库吗? 这并非一个简单的“是”或“否”的问题,而是取决于你的业务规模、技术栈选择以及对数据持久性、安全性和维护成本的综合考量,传统的建站模式往往将数据库与Web服务器部署在同一台物理机或虚拟主机上,对于静态博客或低频更……

    2026年7月4日
    21300
  • 微信平台用什么开发的?微信平台开发语言有哪些

    微信平台的开发并非单一技术的简单堆砌,而是一个以原生开发为核心、跨平台技术为辅助、云端服务为支撑的复杂生态体系,核心结论在于:微信客户端本身主要采用C++和Objective-C/Swift(iOS)、Java(Android)进行原生开发,以确保极致的性能和稳定性;而微信生态内的应用(如小程序、公众号H5)则……

    2026年3月8日
    15500
  • 共建中国首个智慧旅游小镇有哪些亮点?智慧旅游小镇建设方案

    【共建中国首个智慧旅游小镇】2026年服务器性能深度测评与选型指南随着“智慧旅游”概念的全面落地,传统景区正加速向数字化、智能化转型,构建中国首个智慧旅游小镇,不仅意味着硬件设施的升级,更核心的是背后高并发、低延迟、高可用的云计算基础设施支撑,在2026年的技术背景下,面对海量游客实时数据、VR/AR沉浸式体验……

    2026年6月19日
    2500
  • 软件开发能申请专利吗,软件专利申请流程是怎样的

    构建卓越的软件系统是一个将抽象需求转化为具体技术方案的系统工程,其核心在于通过严谨的架构设计与高质量的代码实现,创造出具有独特技术价值的解决方案,这一过程不仅要求开发者具备扎实的编程功底,更需要从工程化的角度审视每一个技术细节,以确保最终交付的产品具备高可用性、高扩展性以及潜在的技术壁垒,以下是构建高质量软件系……

    2026年2月25日
    12400

发表回复

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