Flask分页:基于flask-sqlalchemy和jinja
2021-01-14 本文已影响0人
xiaogp
摘要:Flask
,flask-sqlalchemy
,jinja2
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())
在浏览器查看效果

