美文网首页Python学习前端开发学习web框架开发
Flask分页:基于flask-sqlalchemy和jinja

Flask分页:基于flask-sqlalchemy和jinja

作者: xiaogp | 来源:发表于2021-01-14 11:21 被阅读0次

摘要:Flaskflask-sqlalchemyjinja2

flask-sqlalchemy获取分页数据

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

  • items: 获取这一页的数据,返回一个列表,每个元素是各字段数据组成的元组
  • has_next:是否有下一页,True/False
  • has_prev:是否有上一页,True/False
  • total:总数据条数,int
  • page:当前页码数,int
  • pages:总页码数,int
  • next_num:下一页页码,int
  • prev_num:上一页页码,int
  • next():下一页的翻页对象,可以继续调用对象的其他方法和属性
  • prev():上一页的翻页对象,可以继续调用对象的其他方法和属性

使用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

相关文章

网友评论

    本文标题:Flask分页:基于flask-sqlalchemy和jinja

    本文链接:https://www.haomeiwen.com/subject/ponmaktx.html