私が見落としている urllib2 を使用するときに物事をキャッシュする簡単な方法はありますか、それとも自分でロールバックする必要がありますか?
7 に答える
少し低いレベルでの作業を気にしない場合、httplib2 ( https://github.com/httplib2/httplib2 ) はキャッシュ機能を含む優れた HTTP ライブラリです。
次のようなデコレータ関数を使用できます。
class cache(object):
def __init__(self, fun):
self.fun = fun
self.cache = {}
def __call__(self, *args, **kwargs):
key = str(args) + str(kwargs)
try:
return self.cache[key]
except KeyError:
self.cache[key] = rval = self.fun(*args, **kwargs)
return rval
except TypeError: # incase key isn't a valid key - don't cache
return self.fun(*args, **kwargs)
次の行に沿って関数を定義します。
@cache
def get_url_src(url):
return urllib.urlopen(url).read()
これは、HTTP キャッシュ コントロールに注意を払っておらず、アプリケーションの実行中にページをキャッシュしたいだけであると想定しています。
この ActiveState Python レシピが役に立つかもしれません: http://code.activestate.com/recipes/491261/
私は常に、HTTPキャッシングと認証を確実に処理するhttplib2と、stdlibにあり、拡張可能なインターフェイスを備え、HTTPプロキシサーバーをサポートするurllib2を使用することの間で引き裂かれてきました。
ActiveStateレシピは、非常に原始的な方法でのみ、urllib2にキャッシュサポートを追加し始めます。ファイルシステムでバックアップされたストレージをハードコーディングして、ストレージメカニズムの拡張性を考慮に入れていません。また、HTTPキャッシュヘッダーを尊重しません。
httplib2キャッシングとurllib2拡張性の最高の機能を統合するために、httplib2にあるのと同じキャッシング機能のほとんどを実装するようにActiveStateレシピを適応させました。モジュールはjaraco.netにjaraco.net.http.cachingとしてあります。リンクは、この記事の執筆時点で存在しているモジュールを指しています。そのモジュールは現在、より大きなjaraco.netパッケージの一部ですが、パッケージ内の依存関係がないため、モジュールを自由に引き出して、独自のプロジェクトで使用してください。
または、Python 2.6以降をeasy_install jaraco.net>=1.3
使用している場合は、のコードのようなものでCachingHandlerを利用できますcaching.quick_test()
。
"""Quick test/example of CacheHandler"""
import logging
import urllib2
from httplib2 import FileCache
from jaraco.net.http.caching import CacheHandler
logging.basicConfig(level=logging.DEBUG)
store = FileCache(".cache")
opener = urllib2.build_opener(CacheHandler(store))
urllib2.install_opener(opener)
response = opener.open("http://www.google.com/")
print response.headers
print "Response:", response.read()[:100], '...\n'
response.reload(store)
print response.headers
print "After reload:", response.read()[:100], '...\n'
jaraco.util.http.cachingは、キャッシュのバッキングストアの仕様を提供していませんが、代わりにhttplib2で使用されるインターフェースに従うことに注意してください。このため、httplib2.FileCacheはurllib2およびCacheHandlerと直接使用できます。また、httplib2用に設計された他のバッキングキャッシュは、CacheHandlerで使用できる必要があります。
Yahoo Developer Network のこの記事 ( http://developer.yahoo.com/python/python-caching.html ) では、urllib を介して行われた http 呼び出しをメモリまたはディスクにキャッシュする方法について説明しています。
@dbr: https 応答キャッシュも追加する必要がある場合があります:
def https_response(self, request, response):
return self.http_response(request,response)