栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

关于flask入门教程-分页的几种方式

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于flask入门教程-分页的几种方式

关于flask的分页,大家都知道有一个Flask-SQLAlchemy提供的paginate()方法,这个方法配合bootstrap简化了分页连接代码的生成,但其实关于分页数据的返回才是最重要和最难的,数据的生成由多种方法,有原生SQL,有Flask-SQLAlchemy中的原生SQL,有Flask-SQLAlchemy对象数据等等。如何结合数据生成方式和分页组件也算是一个难点吧。

不喜欢ORM的同学,尤其如我,更喜欢写原生SQL多一些,SQL和ORM各有利弊吧。

paginate()方法的返回值是一个Pagination类对象,这个类包含很多的属性,可以用来在模板中生成分页的链接,因此可以将其作为参数传入模板。

Pagination类对象的属性主要有:

has_next:如果在目前页后至少还有一页的话,返回 True。

has_prev:如果在目前页之前至少还有一页的话,返回 True。

next_num:下一页的页面数。

prev_num:前一页的页面数。

另外还有如下的可调用方法:

iter_pages():一个迭代器,返回一个在分页导航中显示的页数列表。

prev():上一页的分页对象。

next():下一页的分页对象。

下面是个标准的分页页面



  
   
  Twitter Bootstrap Tutorial - A responsive layout tutorial  






  
  

           
                                {% for user in pagedata %}
                                
                                {% endfor %}
    
ID 姓名 性别 职位 联系方式 操作
{{ user.userid }} {{ user.username }} {{ user.sex }} {{ user.postcard }} {{ user.phone }}
{{ pagination.links }}

下面是原生SQL和分页组件的结合,原生数据的输出需要转换为字典类型。

# 用户信息主页面
@app.route('/test/', defaults={'page': 1})
@app.route('/test/')
def list_of_users(page):
    page = request.args.get(get_page_parameter(), type=int, default=int(page))
    import sqlite3
    database = 'C:\Python\Pycharm\supermarket\test.db'
    conn = sqlite3.connect(database)
    cur = conn.cursor()
    cur.execute("select username,password,personalname,birthday,sex,phone,postcard,address from userinfo ORDER BY userid ASC LIMIT {limit} offset {offset}".format(limit=5, offset = (5 * int(page)-5)))
    data = [dict(((cur.description[i][0]), value)
                 for i, value in enumerate(row)) for row in cur.fetchall()]
    print("data=", data)
    pagination = Pagination(page=page, total=12,per_page=5)

    return render_template('fenye.html', pagedata = data, pagination=pagination)

下面是db.session.execute和分页组件的组合

# 用户信息主页面
@app.route('/test2/', defaults={'page': 1})
@app.route('/test2/')
def list_of_users2(page):
    # sql主体语句
    sqlpart="select username,password,personalname,birthday,sex,phone,postcard,address from userinfo "
    # where主体语句
    wherepart = " where 1=1 "
    # order by 主体语句
    orderbypart=" ORDER BY userid ASC "
    # 分页语句
    limitpart=" LIMIT {limit} offset {offset} "
    # 每页记录行数暂时内定5
    limit=5
    # 获取当前页码
    page = request.args.get(get_page_parameter(), type=int, default=int(page))
    # 判断当前行和偏移量
    offset=(5 * int(page)-5)
    # 把sql主体语句和where主体语句的SQL合并起来,获取总页数
    sqlcount = "select count(*) from ( "+ sqlpart + wherepart+" )"
    total = db.session.execute(sqlcount).fetchone()[0]
    # 把sql主体语句+where主体语句+order by 主体语句+分页语句合并起来,获取当前页的SQL语句
    sql = sqlpart + wherepart + orderbypart + limitpart
    sql=sql.format(limit=limit, offset=offset)
    # 获取执行结果
    data=db.session.execute(sql).all()
    # 获取分页代码
    pagination = Pagination(page=page, total=total, per_page=5)
    # 将数据和分页代码传给页面
    return render_template('fenye.html', pagedata=data, pagination=pagination)

下面是db.session.query和分页组件的组合

# 用户信息主页面
@app.route('/test3/', defaults={'page': 1})
@app.route('/test3/')
def list_of_users3(page):
    page = request.args.get(get_page_parameter(), type=int, default=int(page))
    pagination=db.session.query(UserInfo.username, UserInfo.password, UserInfo.personalname,UserInfo.birthday,
                                UserInfo.sex,UserInfo.phone, UserInfo.postcard, UserInfo.address).order_by(UserInfo.userid.desc()).
        paginate(page=page, per_page=5, error_out=True)

    items = pagination.items
    total = pagination.total
    pagination = Pagination(page=page, total=total, per_page=5)
    print('pagination=', pagination)
    print('pagination.page=',pagination.page) #当前页数
    print('pagination.pages=',pagination.pages) #总页数
    print('pagination.total=',pagination.total) #数据总条数
    print('pagination.has_prev=',pagination.has_prev) #是否存在上一页 返回布尔值
    print('pagination.has_next=',pagination.has_next) #是否存在下一页 返回布尔值
    return render_template('fenye.html', pagedata=items, pagination=pagination)

下面是数据对象和分页组件的结合

# -------------------------用户信息管理------------------------
# 用户信息主页面
@app.route('/test4/', defaults={'page': 1})
@app.route('/test4/')
def list_of_users4(page):
    page = request.args.get(get_page_parameter(), type=int, default=int(page))

    paginate = UserInfo.query.order_by('userid').paginate(page=page, per_page=5, error_out=False)
    pagedata = paginate.items  # 当前页数的记录列表
    total = paginate.total
    pagination = Pagination(page=page, total=total, per_page=5)
    if pagedata:
        return render_template('fenye.html', pagination=pagination, pagedata=pagedata)
    else:
        return render_template('404.html'), 404

数据生成的方式不同,部分数据生成方式需要再次转换,pagination的使用方式是一致的,但pagedata是不同的,需要关注。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739311.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号