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()
|