title: Pagination with PyMongo and Flask
body: <p>I found <a href="https://pythonhosted.org/Flask-paginate/" rel="nofollow">here</a> a nice template for a pagination. However, this example was done with SQLlite, but I rewrote in order to be able to use PyMongo.</p>
  
  <p>This script creates users and save them to MongoDB with help of PyMongo:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>I modified the orginal <a href="https://github.com/lixxu/flask-paginate/blob/master/example/app.py" rel="nofollow">app.py</a> script in onrder to be able to use PyMongo. This is the modified script:</p>
  
  <pre><code>#!/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)
  </code></pre>
  
  <ul>
  <li><p>Is there a way to avoid to use <code>count()</code> by clicking to the next or previous page in the pagination menu?</p></li>
  <li><p>What did I forget to change so the actual user get be shown in the browser, because currently I only get the pagination menu without users?</p></li>
  </ul>