暸解分頁實作:
基本上透過 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