Google App Engine Python:スケジュール、キャッシュ、テンプレートによる効率的更新(2)。- memcache
前回は、スクリプトを指定した時間に起動できるスケジュール・タスクを実現するための「cron.yaml」の記述方法について説明した。今回は、そのスケジュールにしたがって実行されるスクリプトで、外部から取得したデータを加工したうえで、キャッシュに保存する方法について説明しよう。
外部から取得するデータには、前々回の「Python:xml.etree.ElementTree, 外部 RDF。」の記事で用いた goo のランキングRDFを今回もサンプルとする。
まず、サンプルとして「daily.py」のソースコードを紹介する。
def updateKeywords(): from google.appengine.api import urlfetch from google.appengine.api import memcache import xml.etree.cElementTree as etree url='http://ranking.goo.ne.jp/rss/keyword/keyrank_all1/index.rdf' xml=urlfetch.fetch(url).content rootTree=etree.fromstring(xml) titles = rootTree.findall('.//{http://purl.org/rss/1.0/}title') if titles: frg = '<ul>' n=0 for i in titles: if n>0: frg += '<li>'+item+ '</li>' n=n+1; frg += '</ul>' memcache.set("gooRanking",frg) if __name__ == "__main__": updateKeyword()
ここで、updateKeyword()関数を定義しているのは、別のスクリプトでインポートして、この関数を利用できるようにするためである。キャッシュは、何らかの事情で失われる危険性があるので、それに備えて、キャッシュが取得できない場合には、このupdateKeyword()関数を実行できるようにしておく。
cron.yaml で指定した時刻には、このスクリプトファイルが実行される。
その場合には、「if __name__ == "__main__":」の記述にしたがって、updateKeyword() が実行される。
インポートするモジュール
インポートするのは、次の3つのモジュール。
from google.appengine.api import urlfetch
外部ファイルをフェッチするため。
from google.appengine.api import memcache
memcache を利用するため。
import xml.etree.cElementTree as etree
XML からデータを取得するため。
HTML断片の生成
取得した title を HTML のリストとした。
なお「n>1:」として、最初の title を排除しているのは、最初の title が channel 要素の title だからだ。キーワード自体は、item 要素内の title なので、最初の title は除いた。
memcache への保存
ご覧の通り、memcache.set()で、キーと値を指定するだけ。
これで、memcache にデータが保存される。
memcache からのデータの取得については、次回触れる。