Python利用flask sqlalchemy实现分页效果

下面为你详细讲解如何利用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应用中使用分页效果,可以按照以下步骤操作:

  1. 安装flask_sqlalchemy包,并创建一个用于存储数据的sqlite数据库文件。
  2. 创建一个名为Article的model,描述我们要分页查询的数据。
  3. 创建一个视图函数,处理分页请求,并返回相应的数据。
  4. 创建一个模板页面,将获取到的文章列表渲染到页面上,显示分页控件。

通过以上步骤,我们就可以实现分页效果了。

示例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技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Python基于Webhook实现github自动化部署

    当我们需要在github代码更新后自动化部署Web应用时,我们可以通过使用Webhook来实现。本文将介绍如何使用Python基于Webhook实现github自动化部署,整个流程可以分为以下几个步骤: 在github仓库中添加Webhook 编写Python代码监听github的Webhook请求 自动拉取代码 自动部署应用 下面,我们分别来详细讲解每个步…

    Flask 2023年5月15日
    00
  • 用 Flask 实现发送电子邮件

    Flask 是一款轻量级的 Web 框架,非常适合快速开发小型 Web 应用。 在这篇文章中,我们将详细介绍如何在 Flask 应用中发送邮件。 安装 Flask-Mail 扩展 首先,我们需要安装 Flask-Mail 扩展来发送邮件。可以使用下面的命令来安装 Flask-Mail: pip install Flask-Mail 接下来,我们需要设置 Fl…

    Flask 2023年3月13日
    00
  • python unittest实现api自动化测试

    下面我将详细讲解“python unittest实现api自动化测试”的完整攻略,包含两条示例说明。 什么是Python unittest? Python unittest 是 Python 自带的一个测试框架,它可以简化单元测试、集成测试、功能测试等自动化测试任务的编写和管理。它与 Python 的标准库一起发布,无需额外的安装,使用起来也非常简单。Pyt…

    Flask 2023年5月15日
    00
  • Flask模板引擎之Jinja2语法介绍

    Flask模板引擎之Jinja2语法介绍 在Flask中,Jinja2是为构建动态web应用程序提供的一个模板引擎,可以轻松地将应用程序与HTML(或其他文本)集成,并在呈现页面之前修改动态内容。 变量 在Jinja2中,使用双大括号来包含变量名,如 {{ variable_name }}。 <!DOCTYPE html> <html&gt…

    Flask 2023年5月15日
    00
  • Flask使用Pyecharts在单个页面展示多个图表的方法

    下面是详细讲解”Flask使用Pyecharts在单个页面展示多个图表的方法”的完整攻略,包含两条示例说明: 概述 Pyecharts提供了一种简单的方式展示图表,它基于Echarts,提供类似Python的API。使用Pyecharts生成单个图表很容易,但如果需要在一个页面上展示多个图表时,可能就需要一些额外的处理。本攻略将介绍使用Flask和Pyech…

    Flask 2023年5月15日
    00
  • Linux中使用top命令的技巧

    下面是“Linux中使用top命令的技巧”的完整攻略。 一、什么是top命令 top命令是一款常用的系统监控工具,可以实时查看系统的资源占用情况,包括进程占用的CPU、内存等。 二、top命令的参数和用法 top命令的常用参数如下: -d:指定刷新时间,默认为3秒; -p:指定监控的进程PID; -u:指定监控的用户; -H:显示进程的线程; -i:不显示I…

    Flask 2023年5月15日
    00
  • 用ReactJS和Python的Flask框架编写留言板的代码示例

    以下是“用ReactJS和Python的Flask框架编写留言板的代码示例”的完整攻略: ReactJS前端示例 首先,创建一个React组件,命名为MessageBoard。组件内部包含一个state变量用于存储留言板上的消息,以及一个form用于用户输入。 import React, { Component } from ‘react’; class M…

    Flask 2023年5月15日
    00
  • Vue打包路径配置过程

    下面是 Vue 打包路径配置的完整攻略: 1. 理解打包路径 在 Vue 应用中,所有的资源文件都可以被打包(Bundle)到一起,如 JS、CSS、图片等等。在浏览器端使用时,需要访问打包后的文件,这些文件在浏览器中被认为是相对于 HTML 引用的路径来解析的。因此,我们需要对打包路径进行配置。打包路径分为两种情况: 在开发环境下使用的路径 在生产环境下使…

    Flask 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部