下面为你详细讲解如何利用flask sqlalchemy实现分页效果。
准备工作
首先,我们需要安装flask sqlalchemy包,可以通过 pip install flask_sqlalchemy 命令进行安装。另外,我们还需要创建一个用于存储数据的数据库。这里我们使用sqlite作为数据库,创建一个名为example.db的数据库文件,以存储数据。
创建model
在创建分页效果之前,我们需要先创建一个模型来描述我们要分页查询的数据。在本例中,我们以文章作为数据来源,创建一个名为Article的Model,如下所示:
from app import db
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
content = db.Column(db.Text)
在这个模型中,我们定义了id、title和content三个字段,分别用于存储文章的编号、标题和内容。
创建视图函数
接下来,我们需要创建一个视图函数,用于处理分页请求。在这个函数中,我们需要获取当前页码、每页显示的文章数量,计算出该页面应显示的文章范围,再从数据库中获取相关文章,并返回给客户端。
from flask import Blueprint, render_template, request
from app.models import Article
pagination = Blueprint('pagination', __name__)
@pagination.route('/')
def index():
# 获取当前页码,默认为1
page = request.args.get('page', 1, type=int)
# 获取每页显示的文章数量,默认为10
per_page = request.args.get('per_page', 10, type=int)
# 计算当前页面应显示的文章范围
start = (page - 1) * per_page
end = start + per_page
# 从数据库中获取相关文章
articles = Article.query.slice(start, end)
# 计算总文章数
total = Article.query.count()
return render_template('index.html', articles=articles, total=total, page=page, per_page=per_page)
在这个视图函数中,我们首先通过request.args.get()方法获取当前页码和每页显示的文章数量,在没有指定的情况下,分别默认设为1和10。接着,我们根据当前页码和每页显示的文章数量,计算出该页面应显示的文章范围,使用slice()方法从数据库中获取相关文章。最后,我们还需要通过query.count()方法计算出总共有多少篇文章,以便于在页面中计算页数和显示分页控件。
编写模板页面
最后,我们需要编写模板页面,将获取到的文章列表渲染到页面上。在模板中,我们可以使用flask自带的分页控件,来快速实现分页效果。具体代码如下:
{% extends 'base.html' %}
{% block content %}
<h1>文章列表</h1>
<ul>
{% for article in articles %}
<li>{{ article.title }}</li>
<p>{{ article.content }}</p>
{% endfor %}
</ul>
{% if total > per_page %}
<div class="pagination">
{% if page > 1 %}
<a href="{{ url_for('pagination.index', page=page-1) }}">上一页</a>
{% endif %}
{% if page > 2 %}
<a href="{{ url_for('pagination.index', page=1) }}">1</a>
{% if page > 3 %}
<span>...</span>
{% endif %}
{% endif %}
{% if page-1 > 0 %}
<a href="{{ url_for('pagination.index', page=page-1) }}">{{ page-1 }}</a>
{% endif %}
<a href="{{ url_for('pagination.index', page=page) }}" class="active">{{ page }}</a>
{% if page+1 <= total_pages %}
<a href="{{ url_for('pagination.index', page=page+1) }}">{{ page+1 }}</a>
{% endif %}
{% if total_pages-page > 2 %}
{% if page+2 < total_pages %}
<span>...</span>
{% endif %}
<a href="{{ url_for('pagination.index', page=total_pages) }}">{{ total_pages }}</a>
{% endif %}
{% if page < total_pages %}
<a href="{{ url_for('pagination.index', page=page+1) }}">下一页</a>
{% endif %}
</div>
{% endif %}
{% endblock %}
在这个模板页面中,我们首先循环遍历文章列表,将每篇文章的标题和内容渲染到页面上。接着,我们判断总文章数是否大于每页显示的文章数量,如果是,则显示分页控件。在分页控件中,我们通过跳转不同的url,实现页面跳转,并计算出当前页面对应的页码。其中,上一页、下一页、第一页和最后一页的跳转url,分别对应pagination.index的不同参数。而中间的页码,通过计算上一页和下一页的页码,以及当前页码,来计算得出。
示例演示
以下是两条示例说明,欢迎查看。
示例1
如果我们想要在我们的flask应用中使用分页效果,可以按照以下步骤操作:
- 安装flask_sqlalchemy包,并创建一个用于存储数据的sqlite数据库文件。
- 创建一个名为Article的model,描述我们要分页查询的数据。
- 创建一个视图函数,处理分页请求,并返回相应的数据。
- 创建一个模板页面,将获取到的文章列表渲染到页面上,显示分页控件。
通过以上步骤,我们就可以实现分页效果了。
示例2
以下是一个完整的代码演示:
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
content = db.Column(db.Text)
@app.route('/')
@app.route('/<int:page>')
def index(page=1):
PER_PAGE = 10
articles = Article.query.order_by(Article.id.desc()).paginate(page, PER_PAGE)
return render_template('index.html', articles=articles)
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,我们创建了一个名为Article的Model,并在视图函数中调用paginate()方法来获取相关文章,并将结果渲染到页面上。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用flask sqlalchemy实现分页效果 - Python技术站