2014-12-28 4 views
1

here 페이지 매김을위한 멋진 템플릿을 발견했습니다. 그러나이 예제는 SQLlite로 수행되었지만 CouchDB를 사용할 수 있도록 다시 작성했습니다.CouchDB로 플라스크 - 페이지 매김

이 스크립트는 사용자를 작성하고 CouchDB를에 저장 :

from couchdb import Server 
import sys 

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


if __name__ == '__main__': 
    server = Server() 
    db = server.create("pagination") 

    fill_data(1000) 

내가 CouchDB를 사용할 수 있도록 onrder의 orginal 한 app.py 스크립트를 수정했습니다.

from __future__ import unicode_literals 
from flask import Flask, render_template, g, current_app, request 
from flask.ext.paginate import Pagination 
from couchdb import Server 

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

@app.route('/') 
def index(): 
    """ 
    Map function 
    function(doc) { 
     emit(doc._id, doc.uname); 
    } 
    """ 
    for row in db.view('_design/snp/_view/by_unames'): 
     print row 

    total = ??? 
    print total 
    page, per_page, offset = get_page_items() 
    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__': 

    server = Server() 
    db = server["pagination"] 
    app.run(debug=True) 
  • 뷰에서 총 수를 얻을 수있는 가장 좋은 방법은 무엇입니까 :이 수정 된 스크립트입니다?

  • 페이지 매기기 메뉴에서 다음 또는 이전 페이지를 클릭하여 총 횟수를 다시 계산하지 않으려면 어떻게해야합니까?

답변

1

CouchDB는보기에서 총 문서 수를 자동으로 계산하므로 쉽게 만듭니다.

curl http://127.0.0.1:5984/pagination/_design/pagination/_view/by_unames?limit=11&startkey=%22101%22 

이것은 limit 쿼리 매개 변수가 사용되었지만 것을

{"total_rows":1000,"offset":4,"rows":[ 
{"id":"101","key":"101","value":"name_101"}, 
{"id":"102","key":"102","value":"name_102"}, 
{"id":"103","key":"103","value":"name_103"}, 
{"id":"104","key":"104","value":"name_104"}, 
{"id":"105","key":"105","value":"name_105"}, 
{"id":"106","key":"106","value":"name_106"}, 
{"id":"107","key":"107","value":"name_107"}, 
{"id":"108","key":"108","value":"name_108"}, 
{"id":"109","key":"109","value":"name_109"}, 
{"id":"11","key":"11","value":"name_11"}, 
{"id":"110","key":"110","value":"name_110"} 
]} 

공지 사항을 산출 :

의이 예를 살펴, 우리가 그것을하는 동안 일부 쿼리 매개 변수를 던져 보자 11 개의 문서 만 가져 오면 total_rows은 여전히 ​​1000으로 표시되며 이는보기의 문서 수입니다.

startkey 매개 변수는 couchDB에게 계산을 시작할 문서를 지정하는 데 사용할 수 있습니다. 이것은 CouchDB 안내서에있는 recommended 메소드 인 빠른 "링크 된 목록"스타일 페이지 매김을 작성하는 데 사용될 수 있습니다. 당신은 파이썬 CouchDB를 라이브러리를 사용하고 구체적 사례를 들어

,

x = db.view('pagination/by_unames', limit=11, startkey="101") 

사용할 수 있습니다 같은 라인. x.rows은 ID가 "101"이고 x.total_rows 인 문서로 시작하는 11 개의 행을 가지며, 이는보기의 문서의 총 개수입니다.