笔者将为你详细讲解“Python+Flask实现自定义分页的示例代码”的完整攻略。
简介
在Flask开发Web应用过程中,实现分页功能可能会涉及到数据库查询、分页计算等多种操作,本文将介绍使用Python+Flask框架实现自定义分页的示例代码并解释实现细节。
示例1:自定义分页函数
实现思路
自定义分页函数主要的目的是减少重复代码,实现通用分页逻辑,具体的实现思路如下:
- 获取每一页需要展示的数据,这里可以通过查询数据库来实现;
- 根据传入的参数计算出该页的起始下标和终止下标;
- 返回当前页需要展示的数据和当前页的其他信息。
实现步骤
步骤一:导入Flask框架和相关模块
首先需要导入需要使用到的Flask框架和相关模块,具体代码如下:
from flask import Flask, request, jsonify
import math
import random
步骤二:定义分页函数
根据实现思路中的步骤1至3,我们可以定义一个自定义分页函数paginate
,具体代码如下:
def paginate(data_list, page, per_page):
# 计算总页数
total_page = math.ceil(len(data_list) / per_page)
# 确认page值有效性, 超出边界取最后一页
page = min(page, total_page)
page = max(page, 1)
# 计算当前页的起始下标和终止下标
start_index = (page - 1) * per_page
end_index = min(start_index + per_page, len(data_list))
# 获取当前页需要展示的数据
paginated_data_list = data_list[start_index:end_index]
# 返回包含所有相关分页信息的json对象
return {
'total_page': total_page,
'current_page': page,
'per_page': per_page,
'total': len(data_list),
'data': paginated_data_list
}
步骤三:定义Flask路由和对应处理函数
最后,我们需要在Flask中定义一个路由,并在对应的处理函数中调用自定义分页函数paginate
,将查询得到的数据传入分页函数中计算分页信息并返回。具体代码如下:
app = Flask(__name__)
@app.route('/data', methods=['GET'])
def data():
# 假设这里查询得到了1000条数据
data_list = [random.randint(1, 100) for i in range(1000)]
page = int(request.args.get('page', 1))
per_page = int(request.args.get('per_page', 10))
result = paginate(data_list, page, per_page)
return jsonify(result)
步骤四:运行Flask应用
最后,我们需要运行Flask应用,具体可以使用以下代码:
if __name__ == '__main__':
app.run(debug=True, port=5000)
测试分页功能
使用Python的requests库可以对实现的分页功能进行测试:
import requests
url = 'http://127.0.0.1:5000/data?page=1&per_page=10'
response = requests.get(url)
print(response.json())
运行以上代码,可以在控制台输出包含分页信息的json对象:{'current_page': 1, 'data': [83, 99, 75, 20, 77, 20, 2, 26, 85, 60], 'per_page': 10, 'total': 1000, 'total_page': 100}
。
示例2:自定义分页网页模板
实现思路
自定义分页网页模板的实现思路如下:
- 在HTML代码中定义一个分页区域;
- 在Flask中定义一个处理函数,根据查询参数计算出当前页需要展示的数据和相关分页信息;
- 将查询得到的数据和分页信息传入HTML页面中,展示在分页区域内。
实现步骤
步骤一:定义HTML页面
首先,我们需要在HTML代码中定义一个分页区域。假设我们需要实现的分页功能会用到Bootstrap的样式,那么可以类似以下代码定义分页区域:
...
<body>
<div class="data-container">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>ID</th>
<th>Value</th>
</tr>
</thead>
<tbody>
{% for item in data %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.value }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<nav aria-label="...">
<ul class="pagination">
{% if data %}
<li class="page-item {% if current_page == 1 %}disabled{% endif %}">
<a class="page-link" href="{{ url_for('page', page=current_page-1) }}" tabindex="-1">Previous</a>
</li>
{% endif %}
{% for i in range(1, total_page+1) %}
{% if i == current_page %}
<li class="page-item active">
<span class="page-link">{{ i }}</span>
</li>
{% else %}
<li class="page-item">
<a class="page-link" href="{{ url_for('page', page=i) }}">{{ i }}</a>
</li>
{% endif %}
{% endfor %}
{% if data %}
<li class="page-item {% if current_page == total_page %}disabled{% endif %}">
<a class="page-link" href="{{ url_for('page', page=current_page+1) }}">Next</a>
</li>
{% endif %}
</ul>
</nav>
</body>
...
步骤二:定义Flask路由和对应处理函数
定义Flask路由和对应处理函数,根据查询参数计算出当前页需要展示的数据和相关分页信息,并将数据和分页信息传入HTML页面中。具体代码如下:
from flask import Flask, render_template, request
import sqlalchemy
from sqlalchemy import create_engine, Column, Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建数据库连接
engine = create_engine('sqlite:///test.db')
# 创建Session
Session = sessionmaker(bind=engine)
session = Session()
# 定义数据模型
Base = declarative_base()
class Data(Base):
__tablename__ = 'data'
id = Column(Integer, primary_key=True)
value = Column(Integer)
def __repr__(self):
return '<Data id=%d, value=%d>' % (self.id, self.value)
# 插入测试数据
Base.metadata.create_all(engine)
for i in range(1000):
data = Data(value=i)
session.add(data)
session.commit()
# Flask应用
app = Flask(__name__)
@app.route('/')
@app.route('/page')
def page():
page = int(request.args.get('page', 1))
per_page = 10
data_list = session.query(Data).order_by(Data.id).all()
result = paginate(data_list, page, per_page)
return render_template('page.html', **result)
步骤三:运行Flask应用
最后,运行Flask应用即可在浏览器中查看分页效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python+Flask实现自定义分页的示例代码 - Python技术站