Google App Engine Python:スケジュール、キャッシュ、テンプレートによる効率的更新(3)。- memcache,template
前々回は、スクリプトを指定した時間に起動できるスケジュール・タスクを実現するための「cron.yaml」の記述方法について、前回は、そのスケジュールにしたがって実行されるスクリプトによって、外部から取得したデータを加工したうえで、キャッシュに保存する方法について説明した。今回は、キャッシュからデータを取り出して、テンプレートに埋め込んで表示させよう。
前回のサンプルによって、memcache の"gooRanking"キーには、次のような文字列が格納されている。
<ul> <li>キーワード1</li> <li>キーワード2</li> <li>キーワード3</li> <li>キーワード4</li> </ul>
これを取り出すのは簡単だ。キー名を引数に取り、memcache の get メソッドを用いる。
memcache.get("gooRanking")
後は、この取り出した文字列をテンプレートに埋め込めばよい。
from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app import os from google.appengine.ext.webapp import template from google.appengine.api import memcache from daily import updateKeywords class MainPage(webapp.RequestHandler): def get(self): gooRanking = memcache.get('gooRanking') if not gooRanking : updateKeywords() gooRanking = memcache.get('gooRanking') path = os.path.join(os.path.dirname(__file__), 'index.html') self.response.out.write(template.render(path, { 'gooRanking':gooRanking })) application = webapp.WSGIApplication([('/', MainPage)],debug=True) def main(): run_wsgi_app(application) if __name__ == "__main__": main()
「if not gooRanking :」のブロックは、前回も説明したが、memcache のデータが失われた場合に、緊急避難として、データを再作成するためのもの。
テンプレート・ファイルの"index.html"には、データを埋め込むためのテンプレート変数を記述しておく。その部分に取得した文字列が埋め込まれる。
<html> <head> <title>memcache から取得したデータをテンプレートに埋め込んだサンプル</title> </head> <body> <h1>memcache から取得したデータをテンプレートに埋め込んだサンプル</h1> {{ gooRanking }} </body> </html>
このページにアクセスすると、リストが埋め込まれた状態で表示される。
もちろん、「app.yaml」でリクエストハンドラーを設定しておき、このページのURLにアクセスできるようにしておかなければならない。
前回と前々回で説明した cron によって、リストの内容は、毎日0時12分を境に書き換わる。