File: app.py

package info (click to toggle)
flask-paginate 2024.4.12-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 416 kB
  • sloc: python: 961; makefile: 143
file content (134 lines) | stat: -rw-r--r-- 3,422 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import unicode_literals

import sqlite3

import click
from flask import Flask, current_app, g, render_template, request
from flask_paginate import Pagination, get_page_args, get_parameter

click.disable_unicode_literals_warning = True

app = Flask(__name__)
app.config.from_pyfile("app.cfg")


@app.before_request
def before_request():
    g.conn = sqlite3.connect("test.db")
    g.conn.row_factory = sqlite3.Row
    g.cur = g.conn.cursor()


@app.teardown_request
def teardown(error):
    if hasattr(g, "conn"):
        g.conn.close()


@app.route("/")
def index():
    g.cur.execute("select count(*) from users")
    total = g.cur.fetchone()[0]
    page, per_page, offset = get_page_args()
    if per_page:
        sql = "select name from users order by name limit {}, {}".format(
            offset, per_page
        )
    else:
        sql = "select name from users order by name"

    g.cur.execute(sql)
    users = g.cur.fetchall()
    page_name = get_parameter()
    per_page_name = get_parameter(default="per_page")
    pagination = get_pagination(
        total=total,
        record_name="users",
        **{page_name: page, per_page_name: per_page},
    )
    return render_template(
        "index.html",
        users=users,
        pagination=pagination,
    )


@app.route("/users", defaults={"page": 1})
@app.route("/users/page/<int:page>")
def users(page):
    g.cur.execute("select count(*) from users")
    total = g.cur.fetchone()[0]
    page, per_page, offset = get_page_args(per_page_parameter="pp", pp=15)
    if per_page:
        sql = "select name from users order by name limit {}, {}".format(
            offset, per_page
        )
    else:
        sql = "select name from users order by name"

    g.cur.execute(sql)
    users = g.cur.fetchall()
    pagination = get_pagination(
        page=page,
        per_page=per_page,
        total=total,
        record_name="users",
    )
    return render_template(
        "index.html",
        users=users,
        pagination=pagination,
        active_url="users-page-url",
    )


@app.route("/search/<name>")
def search(name):
    """The function is used to test multi values url."""
    sql = "select count(*) from users where name like ?"
    args = ("%{}%".format(name),)
    g.cur.execute(sql, args)
    total = g.cur.fetchone()[0]

    page, per_page, offset = get_page_args()
    sql = "select * from users where name like ? limit {}, {}"
    g.cur.execute(sql.format(offset, per_page), args)
    users = g.cur.fetchall()
    pagination = get_pagination(
        page=page,
        per_page=per_page,
        total=total,
        record_name="users",
    )
    return render_template(
        "index.html",
        users=users,
        page=page,
        per_page=per_page,
        pagination=pagination,
    )


def get_css_framework():
    css = request.args.get("bs")
    if css:
        return css

    return current_app.config.get("CSS_FRAMEWORK", "bootstrap4")


def get_pagination(**kwargs):
    return Pagination(css_framework=get_css_framework(), **kwargs)


@click.command()
@click.option("--port", "-p", default=5000, help="listening port")
def run(port):
    app.run(debug=True, port=port)


if __name__ == "__main__":
    run()