flask-sqlalchemy app分页
一、flask-sqlalchemy中分页
@app.route('/fieldlistquery' ,methods=['GET','POST'])
def fieldlistquery():#利用Flask分页处理的paginate对象,完成分页查询
"""
Query fieldlist
"""
page_limit_size = 5
page_limit_defult = 5
row2dict = lambda row: {col.name: str(getattr(row, col.name)) for col in row.__table__.columns}#将sqlalchemy result对象转换为dict对象
pagenum = request.args.get('pagenum', 1, type=int) #参数 type=int 保证参数无法转换成整数时,返回默认值。
pagesize = request.args.get('pagesize', type=int)
pagesize = pagesize if (pagesize is not None and pagesize < page_limit_size ) else page_limit_defult
filter = [1==1]
query_list = None
total_page = None
current_page = None
rsp = {'status':200,'data':[]}
try:
#.with_entities(Fieldlist.name,Fieldlist.id)
paginate = Fieldlist.query.filter(*filter).order_by(Fieldlist.fieldname.desc()
).paginate(pagenum, per_page = pagesize, error_out=False) #页数是 paginate() 方法的第一个参数,也是唯一必需的参数。可选参数 per_page 用来指定每页显示的记录数量;如果没有指定,则默认显示 20 个记录。
print(paginate.items) #属性item 显示当前页面中的所有记录,列表形式
print(paginate.query)#属性query 显示当前页的query对象
print(paginate)#paginate() 方法的返回值是一个 Pagination 类对象,这个类在 Flask-SQLAlchemy 中定义。 这个对象包含很多属性,用于在模板中生成分页链接,因此可将其作为参数传入了模板 css 。
query_list = paginate.items
rsp['total'] = paginate.total #属性total 显示总的记录条数
rsp['currentpage'] = paginate.page #属性page当前页码
except Exception as e:
rsp['status'] = 400
rsp['errmsg'] = e.value
for item in query_list if query_list else []:
rsp['data'].append(row2dict(item))
response = make_response(jsonify(rsp))
return response