使用 PyMongo 和 Flask 进行分页

Posted

技术标签:

【中文标题】使用 PyMongo 和 Flask 进行分页【英文标题】:Pagination with PyMongo and Flask 【发布时间】:2014-12-26 04:01:24 【问题描述】:

我发现here 是一个不错的分页模板。然而,这个例子是用 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)

我修改了 onrder 中的原始 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 分页的任何例子吗? 是的,有一个烧瓶扩展,您可以导入并与 mongoengine 一起使用它很容易使用from flask.ext.mongoengine.pagination import Pagination 是的,使用它flask-mongoengine.readthedocs.io/en/latest 【参考方案1】:

使用此链接,它将有助于使用 flask-paginate

对数据进行分页

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

如果您不使用 Flask,请使用:

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

希望对您有所帮助!

【讨论】:

以上是关于使用 PyMongo 和 Flask 进行分页的主要内容,如果未能解决你的问题,请参考以下文章

如何将 PyMongo 与 Flask 蓝图一起使用?

如何使用 flask_pymongo 和 flask_admin 添加管理员

PyMongo 和 Flask 的 Jsonify 包含转义斜线

使用 flask_pymongo 时身份验证失败

Flask 扩展 Flask-PyMongo

Flask,Pymongo和Mongoengine - ImportError:无法导入名称'app'