Python学习前端开发学习web框架开发

Flask分页:基于flask-sqlalchemy和jinja

2021-01-14  本文已影响0人  xiaogp

摘要:Flaskflask-sqlalchemyjinja2

flask-sqlalchemy获取分页数据

在flask-sqlalchemy操作的数据模型的过程中,使用paginate()方法将结果返回为一个翻页对象,不同于all()first()可以直接获得数据,paginate返回的结果是一个对象,paginate接收三个参数,第一个是从第几页开始(从1开始),默认是第一页,第二个参数是每页多少条数据,默认是20,第三个参数处理页数越界默认为True,如果是True则页数小于等于0或者大于最大页数都会报404错误,如果设置为False,页数小于等于0会跳回第一页,页数大于最大值会返回空列表,paginate对象有以下方法

使用flask-sqlalchemy语法排序返回paginate对象代码实例

    res = PiraScore.query.filter(PiraScore.datetime == '2020-12-07').order_by(
            PiraScore.score.desc()).with_entities(PiraScore.ent_name, PiraScore.score).paginate(1, 5)
    print(res)  # <flask_sqlalchemy.Pagination object at 0x7f0545ac73d0>
    print("-----------------------")
    print("items", res.items)  # [('永泰能源股份有限公司', 85), ('北京优胜辉煌教育科技有限公司', 81), ('成都天翔环境股份有限公司', 81), ('重庆钢铁股份有限公司', 78), ('沈阳机床股份有限公司', 77)]
    print("has_next", res.has_next)  # True
    print("has_prev", res.has_prev)  # False
    print("total", res.total)  # 3766
    print("page", res.page)  # 1
    print("pages", res.pages)  # 754
    print("next_num", res.next_num)  # 2
    print("prev_num", res.prev_num)  # None
    print("----next", res.next().items)  # [('沈阳机床股份有限公司', 77), ('上海拉夏贝尔服饰股份有限公司', 77), ('吉林利源精制股份有限公司', 75), ('紫梧桐(北京)资产管理有限公司', 75), ('上海易果电子商务有限公司', 75)]
    print("----prev", res.prev().items)  # [('永泰能源股份有限公司', 85), ('北京优胜辉煌教育科技有限公司', 81), ('成都天翔环境股份有限公司', 81), ('重庆钢铁股份有限公司', 78), ('沈阳机床股份有限公司', 77)]

可见如果是首页,调用前一个paginate对象还是自身,调用前一页的页码是None

jinja2渲染分页模板

在模板中调用翻页对象items获得数据,调用has_prev,has_next进行上下页和最大页数判断判断,调用prev_num,next_num获得上下页的页码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>排名</title>
</head>
<body>
{% for r in res.items %}
    <p>{{ r.ent_name ~ ',' ~r.score}}</p>
{% endfor %}
{% if res.has_prev %}
    <button onclick="window.location.href='rank?page={{ res.prev_num }}'">上一页</button>
{% endif %}
<button>{{ res.page }}</button>
{% if res.has_next and res.page < 5 %}
    <button onclick="window.location.href='rank?page={{ res.next_num }}'">下一页</button>
{% endif %}
</body>
</html>

视图函数

@app.route('/rank', methods=['GET'])
def rank():
    data = request.args.to_dict()
    page = int(data.get('page', 1))
    res = PiraScore.query.filter(PiraScore.datetime == '2020-12-07').order_by(PiraScore.score.desc())\
        .with_entities(PiraScore.ent_name, PiraScore.score).paginate(page, 10)
    return render_template('rank.html', **locals())

在浏览器查看效果


第一页.png
第二页.png
上一篇下一篇

猜你喜欢

热点阅读