2015年7月7日

Webapp2 教學 (13) - 實作分頁 ( Implement paging with Webapp2 tutorial )

上一篇文章中介紹如何透過 Google Datastore 存取資料,本篇要來介紹如何實作分頁功能。( 其他 Webapp2 相關教學可以參考本篇整理 )



暸解分頁實作:
基本上透過 Datastore 實作分頁可以使用 offset 或 cursor 來取得分頁資料。但是根據 Google 官方文件說明,使用 cursor 效能明顯較好,因此本篇文章介紹的方式將會以 cursor 為主。使用 cursor 進行分頁的概念如下:
# 取得所有資料
all = model.MyModel.gql(...)
# 檢查是否有 cursor
if cursor:
   # 使用 cursor 取得分頁資料
   list = all.with_curosr(...)
else:
   # 若無 cursor,則先取得 curosr,並使用 memcache 儲存起來



使用 PagedQuery
上述實作的概念瞭解即可,實際上已經有人將這個概念寫成 Module : PagedQuery,所以我們只需要使用它即可。安裝方式只要將程式碼下載放置專案資料夾內即可。以下程式碼為主要 PagedQuery 使用方式:
from paging import *

class MyPagination(webapp2.RequestHandler):
    def get(self, page=False):
        # 首先取得所有資料,並初始化 PagedQuery 物件,這邊設定 page size 為 10
        all_books = PagedQuery(model.Book.all().order("create_date"), 10)
        if page == False:
            # 若無指定頁面則顯示第一頁,
            books = all_books.fetch_page()
        else:
            # 若有指定頁面則顯示該頁
            books = all_books.fetch_page(int(page))

        # 將頁面資料與頁數傳回前端
        values = {
            "books": books,
            "pages": range(all_books.page_count())
        }
        path = os.path.join(os.path.dirname(__file__), 'your-page.html')
        self.response.out.write(template.render(path, values))

以上就是 PagedQuery 使用的方法。最後提醒一下,若你的資料更新要同步 memcache 部分,PagedQuery 也有提供 clear() 來清空 memcache。


Environment :
  ・ Arch Linux
  ・ Python 2.7

Reference :
  ・ Webapp2 official site
  ・ PagedQuery


熱門文章