如何在不使用SQLAlchemy的情况下实现Flask数据分页?
原生数据库查询实现分页方案
核心思路
直接利用数据库原生的LIMIT和OFFSET语法实现数据分片,同时查询总记录数计算分页参数,最后在模板中渲染分页导航。
后端代码改造
修改你的data函数,加入分页逻辑:
from flask import request, render_template def data(): # 获取当前页码,默认显示第1页 current_page = request.args.get('page', 1, type=int) # 每页固定显示10条数据(可根据需求调整) per_page = 10 # 计算数据偏移量(跳过前面多少条数据) offset = (current_page - 1) * per_page # 1. 查询当前页的目标数据(用参数化查询避免SQL注入) cursor.execute("SELECT * FROM table_data LIMIT %s OFFSET %s", (per_page, offset)) records = cursor.fetchall() # 2. 查询总记录数,用于计算总页数 cursor.execute("SELECT COUNT(*) FROM table_data") total_records = cursor.fetchone()[0] # 向上取整计算总页数 total_pages = (total_records + per_page - 1) // per_page # 处理页码边界,避免无效页码 if current_page < 1: current_page = 1 elif current_page > total_pages: current_page = total_pages # 将分页数据传给模板 return render_template( 'data.html', records=records, current_page=current_page, total_pages=total_pages, per_page=per_page )
注意:不同数据库的
LIMIT/OFFSET语法可能略有差异,比如SQLite用?作为占位符,PostgreSQL支持LIMIT %s OFFSET %s或LIMIT %s, %s,根据你使用的数据库调整占位符格式。
前端模板分页导航
在data.html中添加分页控件,实现页码切换:
<div class="pagination-bar"> <!-- 上一页按钮 --> {% if current_page > 1 %} <a href="{{ url_for('data', page=current_page-1) }}">上一页</a> {% else %} <span class="disabled">上一页</span> {% endif %} <!-- 页码列表 --> {% for page_num in range(1, total_pages + 1) %} {% if page_num == current_page %} <span class="current-page">{{ page_num }}</span> {% else %} <a href="{{ url_for('data', page=page_num) }}">{{ page_num }}</a> {% endif %} {% endfor %} <!-- 下一页按钮 --> {% if current_page < total_pages %} <a href="{{ url_for('data', page=current_page+1) }}">下一页</a> {% else %} <span class="disabled">下一页</span> {% endif %} </div>
额外优化建议
- 允许用户自定义每页条数:可以通过
request.args.get('per_page', 10, type=int)接收前端传入的条数参数 - 大数据量优化:
COUNT(*)在超大表中可能较慢,可考虑用数据库的近似计数(如MySQL的EXPLAIN估算)或缓存总记录数 - 样式美化:给分页控件添加CSS样式,提升用户体验
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

