Skip to content

Instantly share code, notes, and snippets.

@mozillazg
Created December 5, 2017 00:06
Show Gist options
  • Star 48 You must be signed in to star a gist
  • Fork 23 You must be signed in to fork a gist
  • Save mozillazg/69fb40067ae6d80386e10e105e6803c9 to your computer and use it in GitHub Desktop.
Save mozillazg/69fb40067ae6d80386e10e105e6803c9 to your computer and use it in GitHub Desktop.
A simple demo for how to use flask-paginate.

how to use

  1. pip install -U flask-paginate
  2. download app.py and index.html
  3. python app.py
  4. visit http://127.0.0.1:5000/
from flask import Flask, render_template
from flask_paginate import Pagination, get_page_args
app = Flask(__name__)
app.template_folder = ''
users = list(range(100))
def get_users(offset=0, per_page=10):
return users[offset: offset + per_page]
@app.route('/')
def index():
page, per_page, offset = get_page_args(page_parameter='page',
per_page_parameter='per_page')
total = len(users)
pagination_users = get_users(offset=offset, per_page=per_page)
pagination = Pagination(page=page, per_page=per_page, total=total,
css_framework='bootstrap4')
return render_template('index.html',
users=pagination_users,
page=page,
per_page=per_page,
pagination=pagination,
)
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>flask-bootstrap example</title>
<!-- Bootstrap -->
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css">
</head>
<body>
<div class="container">
{{ pagination.links }}
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<th>Value</th>
</tr>
</thead>
<tbody>
{% for user in users %}
<tr>
<td>{{ loop.index + (page - 1) * per_page }}</td>
<td>{{ user }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{{ pagination.links }}
</div>
</body>
</html>
@seabass118
Copy link

This is the best solution to overwrite the per_page value.

def get_items(page, offset=0, per_page=10):
per_page = 50
offset = ((page - 1) * per_page)
return items[offset: offset + per_page]

@GaneshGS
Copy link

Hi,
Thanks for such a wonderful presentation of pagination with flask. I am extracting data from Mongodb with post requests and implementing paginiation. It is showing first page (per_page) list on the webpage but not allowing me to make get requests to call the second and third page. If I bypass post request, I am not able to get data from forms. Any idea of handling pagination in this situation?

@anaveronicaaponte
Copy link

anaveronicaaponte commented Oct 7, 2021

Hello! This is what I was looking for! But I just have a problem, I don't want to use the get_users() function because I already have a SQLite database in my Flask web application. Any advice on how to acheive this through my database?

EDIT: if anybody is wondering, I fixed it. This is my get_users() function (importing sqlite3 module of course):

def get_users(page=1, total=100, per_page=5):
    offset = total - ((page - 1) * per_page) + 1
    con = sqlite3.connect('database.db')
    cur = con.cursor()
    query = '''SELECT column1, column2
                FROM table
                WHERE entry_id < ?
                ORDER BY entry_id DESC
                LIMIT ?;'''
    cur.execute(query, (offset, per_page))
    users = cur.fetchall()
    cur.close()
    con.close()
    return users

And then I modified a bit the index function:

@app.route('/')
def index():
    con = sqlite3.connect('database.db')
    cur = con.cursor()
    page, per_page, offset = get_page_args(page_parameter='page', # I don't use this offset value at all
                                           per_page_parameter='per_page')
    per_page = 5
    cur.execute("SELECT COUNT(entry_id) FROM history")
    total = cur.fetchone()[0]
    cur.close()
    con.close()
    pagination_users = get_users(page=page, total=total, per_page=per_page)
    pagination = Pagination(page=page, per_page=per_page, total=total)
    return render_template('index.html',
                           users=pagination_users,
                           page=page,
                           per_page=per_page,
                           pagination=pagination)

@markdimi
Copy link

markdimi commented Dec 8, 2022

Hello!

@anaveronicaaponte pointed me to the right direction since I am not using SQLalchemy for my db.
Just sqlite (like the official tutorial).

The only problem I had with the above solution was that the results of the first page weren't visible. I fixed this issue by using the offset value from the get_page_args function inside the query of the get_users function, instead of the calculation :

offset = total - ((page - 1) * per_page) + 1

@gmanoukian
Copy link

Dear: the correct way to solve this is like this, it is not necessary to modify anything, I leave the solution in case anyone is interested.

Originally:
page, per_page, offset = get_page_args(page_parameter='page',per_page_parameter='per_page')

Correct:
page, per_page, offset = get_page_args(page_parameter='page',per_page_parameter='per_page',per_page='5')

Best regards

@vickykavthankar
Copy link

thanks @gmanoukian

@vigindian
Copy link

For anyone else struggling to get dataframe + pagination working, this method works - https://www.thepythoncode.com/article/convert-pandas-dataframe-to-html-table-python. Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment