2009-04-01 6 views
1

外部Webサイトからデータを解析する必要がある単純なビューがあるとします。これは許容使用され、すべてのDjangoの他のWebサイトからのデータのキャッシュ

def index(request): 
    source = urllib2.urlopen(EXTERNAL_WEBSITE_URL) 
    bs = BeautifulSoup.BeautifulSoup(source.read()) 
    finalList = [] # do whatever with bs to populate the list 
    return render_to_response('someTemplate.html', {'finalList': finalList}) 

まず:

は今のところ、それは次のようになりますか?

明らかに、これはパフォーマンスが良いわけではありません。外部のウェブサイトのページはかなり大きく、私はそれのほんの一部を抽出しています。私は2つのソリューションを考えました:

  1. これをすべて非同期で行います。ページの残りの部分を読み込み、取得したらデータを入力します。しかし、私はどこから始めるべきか分からない。私はちょうどDjangoから始まり、今まで非同期を何もしていません。
  2. このデータが2〜3分ごとに更新されるかどうかは気にしないので、キャッシングも良い解決策です(余分な往復も節約できます)。このデータをキャッシュするにはどうすればいいですか?
+0

「許容できる使用」を定義してください。何の使用?誰かの著作物の使用? urrlib2の使用? Djangoの使用?誰に受け入れられますか?私?君は?著作権のある素材の所有者ですか? Djangoの開発者ですか? urllib2の開発者ですか? –

答えて

3

キャッシュが

from django.core.cache import cache 
key = 'some-key' 
data = cache.get(key) 
if data is None: 
    # soupify the page and what not 
    cache.set(data, key, 60*60*8) 
    return render_to_response ... 
return render_to_response 

は、あなたの質問に答えるために、非常に簡単です、あなたは非同期的にこれを行うことができますが、その後、あなたは今までそれほど頻繁にキャッシュを更新するために、Djangoのcronのようなものを使用しなければならないでしょう。一方、これをスタンドアロンのPythonスクリプトとして記述し、djangoからインポートしたキャッシュをmemcacheに置き換えることもできます。同じように動作します。サイトで発生する可能性があるパフォーマンス上の問題を軽減し、キャッシュキーが分かっている限り、キャッシュからデータを取得できます。

Jarretのように私はdjangoのキャッシングドキュメントとmemcacheのドキュメントを読んでもっと詳しい情報を得ました。

+0

大好きです! :-) –

5

まず、時期尚早に最適化しないでください。これを働かせてください。

次に、実際のパフォーマンスの問題(存在する場合)を確認するのに十分なログを追加します。

エンドユーザーのPCが最も遅いことがわかります。 .JSライブラリと.CSSとアートワークを取得せず、ブラウザ内で全体をレンダリングすると、別のサイトからデータを取得することは、実際には非常に高速になる可能性があります。

リモートコンテンツの取得が本当に問題であることが確実に確認されたら、本当に。それから、次のことをする必要があります。

    時々リモートフェッチフォームを実行する「crontab」スクリプトを作成します。

  1. リモート結果をキャッシュする場所を設計します。データベースまたはファイルシステムは、1つを選択します。

  2. リモートURLの代わりにキャッシュ(データベースまたはファイルシステム)からデータを取得するようにDjangoアプリを更新します。

リモートサイトのurllib2読み取りがボトルネックであるという絶対的な証拠が得られた後でなければなりません。

1

Djangoには、キャッシングビューの堅牢なビルトインサポートがあります。http://docs.djangoproject.com/en/dev/topics/cache/#topics-cache

ビュー全体(たとえば、あなたの場合)やビューのデータの特定の部分だけをキャッシュするためのソリューションを提供します。キャッシュを更新する頻度などの制御もあります。ジャンゴと

関連する問題