使用PyMongo和Flask进行分页

5 投票
1 回答
14990 浏览
提问于 2025-04-30 13:45

我在这里找到了一个很不错的分页模板。不过,这个例子是用SQLlite写的,我把它改成了可以用PyMongo。

这个脚本创建用户并通过PyMongo把他们保存到MongoDB中:

import sys
from pymongo import MongoClient

def fill_data(users_no):
       for i in range(users_no):
           doc = {
                  '_id': str(i),
                  'uname': "name_" + str(i),
                 }
           sDB.insert(doc)


if __name__ == '__main__':
    db = MongoClient().test
    sDB = db.users

    fill_data(1000)

我修改了原来的app.py脚本,以便能够使用PyMongo。以下是修改后的脚本:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from __future__ import unicode_literals
from flask import Flask, render_template, g, current_app, request
from flask.ext.paginate import Pagination
from pymongo import MongoClient

app = Flask(__name__)
app.config.from_pyfile('app.cfg')

@app.route('/')
def index():
    db_name = "test"
    col_name = "users"

    db = MongoClient()
    sDB = db[db_name][col_name]
    total = sDB.find().count()
    print total
    page, per_page, offset = get_page_items()
    users = sDB.find().skip(offset).limit(per_page)
    for u in users:
        print u
    pagination = get_pagination(page=page,
                per_page=per_page,
                total=total,
                record_name=users,
                )
    return render_template('index.html', users=users,
              page=page,
              per_page=per_page,
              pagination=pagination,
              )


def get_css_framework():
    return current_app.config.get('CSS_FRAMEWORK', 'bootstrap3')


def get_link_size():
    return current_app.config.get('LINK_SIZE', 'sm')


def show_single_page_or_not():
    return current_app.config.get('SHOW_SINGLE_PAGE', False)


def get_page_items():
    page = int(request.args.get('page', 1))
    per_page = request.args.get('per_page')
    if not per_page:
            per_page = current_app.config.get('PER_PAGE', 10)
    else:
            per_page = int(per_page)

    offset = (page - 1) * per_page
    return page, per_page, offset


def get_pagination(**kwargs):
       kwargs.setdefault('record_name', 'records')
       return Pagination(css_framework=get_css_framework(),
          link_size=get_link_size(),
          show_single_page=show_single_page_or_not(),
          **kwargs
          )

if __name__ == '__main__':
    app.run(debug=True)
  • 有没有办法在分页菜单中点击下一页或上一页时避免使用count()

  • 我忘记改什么了,导致浏览器中只显示分页菜单而不显示实际的用户?

暂无标签

1 个回答

0

使用这个链接,它会帮助你使用 flask-paginate 来进行数据分页。

https://harishvc.com/2015/04/15/pagination-flask-mongodb/

如果你没有使用 Flask,可以参考这个:

https://scalegrid.io/blog/fast-paging-with-mongodb/

希望这些对你有帮助!

撰写回答