首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >关于flask入门教程-图书借阅系统-分页显示数据

关于flask入门教程-图书借阅系统-分页显示数据

作者头像
python与大数据分析
发布2022-03-11 17:00:40
发布2022-03-11 17:00:40
9630
举报

在做网页的过程中,随着展示的数据增多,如果要在一页中显示全部内容,浏览速度会变慢且不符合实际需求。在 Web 浏览器中, 内容多的网页需要花费更多的时间生成、下载和渲染, 所以网页内容变多会降低用户体验的质量。这一问题的解决方法是分页 显示数据,进行片段式渲染。

flask进行分页显示数据提供了两种方法,一种是Flask-SQLAlchemy 的Pagination对象,一种是flask_paginate包,其实两者是高度一致的,flask_paginate是直接将Pagination和BootStrap做了绑定,但其实效果不是很好,估计是CSS之间有冲突。

其他方法则是自己定制代码实现分页。

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

代码语言:javascript
复制
@app.route('/index/')
def indexv5():
    page = int(request.args.get('page', 1))
    per_page = int(request.args.get('per_page', 5))
    paginate = BookInfo.query.order_by('isbnno').paginate(page, per_page, error_out=False)
    pagedata = paginate.items
    return render_template('indexv5.html',paginate=paginate, pagedata=pagedata)

html页面代码如下:

代码语言:javascript
复制
{% extends 'base.html' %}
{% block content %}
<div class="panel panel-default">
  <!-- Default panel contents -->
  <div class="panel-heading"><center><h2>Flask 图书馆图书列表</h2></center></div>
  <div class="panel-body">
    <!--p>Flask 图书馆图书列表子标题</p-->
  </div>
         <table class="table table-striped" style="color: black">
      <!--caption><center><h2>Flask 图书馆图书列表</h2></center></caption-->
      <thead>
      </thead>
      <tbody>
            {% for book in pagedata %}
               <tr>
                <td>{{ book.isbnno }}</th>
                <td>{{ book.bookname }}</td>
                <td>{{ book.publisher }}</td>
                <td>{{ book.publicationdate }}</td>
                <td>{{ book.booktype }}</td>
                <td>{{ book.stockdate }}</td>
               </tr>
            {% endfor %}
      </tbody>
     </table>       
</div>       
      <div>
        <center>
            当前页数:{{ paginate.page }}
        总页数:{{ paginate.pages }}
        一共有{{ paginate.total }}条数据
            <ul class="pagination pagination-lg">
            {% if paginate.has_prev %}
                    <li><a href="/index/?page={{ paginate.prev_num }}">上一页</a></li>
            {% endif %}
            {% for i in paginate.iter_pages() %}
                    <li><a href="/index/?page={{ i }}">{{ i }}</a></li>
            {% endfor %}
            {% if paginate.has_next %}
                    <li><a href="/index/?page={{ paginate.next_num }}">下一页</a></li>
            {% endif %} 
            </ul>
        </center>
         </div>

{% endblock %}

最后展示效果:

flask_paginate也可以直接使用,代码就不做详细解读了

代码语言:javascript
复制
from flask_paginate import Pagination, get_page_parameter
PER_PAGE =5
@app.route('/index/')
def index():
    search = False
    q = request.args.get('q')
    if q:
        search = True
    page = request.args.get(get_page_parameter(), type=int, default=1)
    start = (page - 1) * PER_PAGE
    end = start + PER_PAGE
    total = BookInfo.query.order_by('isbnno').count()
    books = BookInfo.query.order_by('isbnno').slice(start, end)
    pagination = Pagination(page=page, per_page=PER_PAGE,total=total, search=search, record_name='books')
    return render_template('indexv6.html',
                           books=books,
                           pagination=pagination,
                           )

相关页面代码如下,要比上面简洁一些。

代码语言:javascript
复制
{% extends 'base.html' %}
{% block content %}
<table class="uk-table uk-table-striped">
    <thead>
        <tr>
            <th>序号</th>
            <th>ISBNNO</th>
            <th>书籍名称</th>
            <th>出版社</th>
            <th>出版时间</th>
            <th>文献类型</th>
            <th>入库时间</th>
        </tr>
    </thead>
    <tbody>
        {% for book in books %}
               <tr>
                <td>{{ loop.index + pagination.skip }}</td>
                <td>{{ book.isbnno }}</td>
                <td>{{ book.bookname }}</td>
                <td>{{ book.publisher }}</td>
                <td>{{ book.publicationdate }}</td>
                <td>{{ book.booktype }}</td>
                <td>{{ book.stockdate }}</td>
               </tr>
            {% endfor %}
    </tbody>
</table>
    {{ pagination.links }}
{% endblock %}

运行后输出的静态html页面,很明显直接输出了bootstrap的标签,引用的bootstrap样式。

代码语言:javascript
复制
<div class="pagination">
        <ul>
                <li class="previous"><a href="/index/">&laquo;</a></li>
                <li><a href="/index/">1</a></li>
                <li class="active"><a>2</a></li>
                <li><a href="/index/?page=3">3</a></li>
                <li><a href="/index/?page=4">4</a></li>
                <li><a href="/index/?page=5">5</a></li>
                <li class="next"><a href="/index/?page=3">&raquo;</a></li>
        </ul>
</div>

展现结果如下,效果不是很理想,推荐使用第一种。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档