2013年12月10日火曜日

python の apiclient.discovery.build() が遅い

google-api-python-client で、Resource オブジェクトを取得するのに
毎度 discovery.py:build() を呼ぶと、毎度 https 通信が発生し動作が遅
くなってしまう。Web アプリの場合なんかは、アクセス毎にこれが発生
するのは問題。

なんで https 通信が発生するのかは、Discovery Document なる、Google
API を利用する際に必要な情報が記された JSON 形式のデータを毎度とり
に行っているから。discovery.py の以下の部分。

    190   logger.info('URL being requested: %s' % requested_url)
    191
    192   resp, content = http.request(requested_url)
    193  
    194   if resp.status == 404:
    195     raise UnknownApiNameOrVersion("name: %s  version: %s" % (serviceName,
    196                                                             version))
    197   if resp.status >= 400:
    198     raise HttpError(resp, content, uri=requested_url)
    199 
ただ、この JSON のデータは毎度取りに行く必要もないようで、一度とっ
たらキャッシュしてしまって、build() でなく build_from_document() を
使うのが良い。
キャッシュの仕方なんだけど、今のところ build() 関数にベタに
print content などとしてしまって、吐出されたやつをファイルに保存
しているが、もっと良い方法あるんだろう。

調べてわかったらまたメモります。