详解Python利用flask sqlalchemy实现分页


本文摘自php中文网,作者零下一度,侵删。

在开发blog系统的时候,我们有一个需求,就是要显示作者已经发表的blog文章的列表,或显示作者关注者的文章列表。实现这个功能并不复杂,只需要在存储文章的数据库中过滤出指定作者的文章,然后渲染HTML显示即可。
但是,这种方法在文章不多的情况下或许是可行的,当文章的数量变多的时候,就无法在一页中显示完所有的文章了。这时就需要将文章列表进行分页显示,每一页只显示指定数量的文章。
这个功能应该如何实现呢?我们能想到的一个直观的方法就是将从数据库中过滤得到的文章列表进行分组,每次只显示一组文章。然后根据用户的需要来显示指定组的文章列表。

Flask-sqlalchemy是关于flask一个针对数据库管理的。文中我们采用一个关于员工显示例子。

首先,我们创建SQLALCHEMY对像db。

1

2

3

4

5

6

7

8

9

10

11

from flask import Flask, render_template,request

from flask_sqlalchemy import SQLAlchemy

 

app = Flask(name,static_url_path='')

app.debug = True

app.secret_key = "faefasdfaf"

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/personal.db' # app的配置,指定数据库路径

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

app.config['SQLALCHEMY_ECHO'] = True

 

db = SQLAlchemy(app)


然后我们利用db创建员工表:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

from datetime import datetime

 

class Employee(db.Model):

  '''员工'''

  tablename = 'employee'

 

  id = db.Column(db.Integer, primary_key=True)

  name = db.Column(db.String(50))

  gender = db.Column(db.String)

  job = db.Column(db.String)

  birthday = db.Column(db.DateTime)

  idcard = db.Column(db.String)

  address = db.Column(db.String)

  salary = db.Column(db.String)

  release_time = db.Column(db.DateTime)

 

  def init(self, name, gender, job, birthday, idcard, address, salary, release_time=None):

    self.name = name

    self.gender = gender

    self.job = job

    self.birthday = birthday

    self.idcard = idcard

    self.address = address

    self.salary = salary

    self.release_time = release_time if release_time else datetime.now()

 

  def repr(self):

    return '<员工{},{},{},{}>'.format(self.id, self.name, self.salary, self.address)


表创建好之后,我们可以从表中查询数据了。


1

2

3

4

5

6

from flask import render_template

from flask.views import MethodView

class EmployeeListView(MethodView): # 获取员工信息

  def get(self,page=1):

    employees = Employee.query.paginate(page,per_page=10)

    return render_template('employeelist.html', employees=employees)


以上我们通过查询,查询出员工信息,然后传给前台一个模板。(以上我们采用了flask的蓝图进行了分模块,假设我们把上面这个定义为视图函数为:employee.list)

注:paginate是分页的方法,第一个参数是页码,第二个是每页显示多少条。但是这样得到的结果不是一列表,需要在传到前台的值加一个 .items,下面举例说明。(利用jinja2模板)

{% for item in employees.items %}

如上所示,在利用Jinja2去取值时,需要在后台传过来的值后面,加上.items。

继续上面的分页,这里我们要再次利用jinja2模板来定义一个方法,以实现分页的功能,这个页面名字就叫:helper.html。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

{% macro render_page_data(page_data,page_function) %}

  <p class="text-center">

    <ul class="page_data">

      <li><a href="{{ url_for(page_function,page = 1) }}">首页</a></li>

      {% if page_data.has_prev %}

        <li><a href="{{ url_for(page_function,page = page_data.prev_num) }}">?</a></li>

      {% endif %}

      {% for page in page_data.iter_pages() %}

        {% if page %}

          {% if page !=page_data.page %}

            <li><a href="{{ url_for(page_function,page = page) }}">{{ page }}</a></li>

          {% else %}

            <li class="active"><a href="#">{{ page }}</a></li>

          {% endif %}

        {% endif %}

      {% endfor %}

      {% if page_data.has_next %}

        <li><a href="{{ url_for(page_function,page = page_data.next_num) }}">?</a></li>

      {% endif %}

      <li><a href="{{ url_for(page_function,page = page_data.pages) }}">末页</a></li>

    </ul>

  </p>

{% endmacro %}


以上是我们利用jinja2的语法定义了一个分布的方法,这个方法,我们传了二个参数,第一个是后台传过来通过db分页查询出来的数据。第二个是我们查询的数据的方法。

这里需要特别说明一下,分页的数据有几个重要的方法:

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

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

  • next_num:下一页的页面数

  • prev_num:前一页的页面数

通过上面的工作之后,最后就只差一步了,我们需要在我们的模板页通过Jinja2导入我们刚刚定义的方法,也就是在上面我们的employeelist.html中导入。

{% import 'helper.html' as helper %}

导入之后,我们就可以在我们需要的地方调用就可以了。

{{ helper.render_pagination(employees,'employee.list') }}

上面就是我们调用我们之前定义的方法。第一个参数,我们从后台传过来的值,第二个就是后台的那个视图函数。

进行了以上操作后,我们就大功告成了,下面看一下,我们实现了的效果图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

以上就是详解Python利用flask sqlalchemy实现分页的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

win7自带Python

Python count函数用法详解

Python安装的图文教程分享

怎么用Python

Python网络编程之使用select实现socket全双工异步通信功能

解决Python大批量读写.doc文件的问题

Python数据分析买什么书

Python之实现自定义分页功能

Python中字符串数组如何逆序排列

Python中有关filter的用法详解

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...