使用PyMongo和Flask实现分页功能

5

我在这里找到了一个很好的分页模板。不过,这个示例是使用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()

  • 我忘记改变什么,以便在浏览器中显示实际用户,因为目前我只能看到分页菜单而没有用户?


为什么你不使用Mongoengine而是使用pymongo?在Mongoengine中,你可以轻松地进行分页。 - hamidfzm
这个模板上面的代码还能用吗?你知道在哪里可以找到Mongoengine分页的示例吗? - user977828
是的,有一个适用于Flask的扩展程序,您可以导入并与Mongoengine一起使用,它很容易使用:from flask.ext.mongoengine.pagination import Pagination - hamidfzm
是的,请使用 https://flask-mongoengine.readthedocs.io/en/latest/。 - KyungHoon Kim
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接