2012-02-18 12 views
1

私はできるだけ早く要求を処理する必要があるdjangoにWebサービスを持っています。 要求ごとにオブジェクトが更新されます。後で地理情報を入力するための要求IPアドレスも保存します。django:保存直後にオブジェクトの余分な情報を埋め込む

地理情報の取得は、外部サービスプロバイダによって行われます。私は彼らにIPアドレスを与え、地理情報を得る。

私はできるだけ早くユーザーの要求に応え、作成/更新直後に地理情報を入力したいと考えています。 (1〜2秒後)

ハンドラが必要です。要求に応答してから1-2秒後です。そして、引数として更新または作成されたオブジェクトを持つ必要があります。

私はそれがpost_saveではないと思いますが、私は正しい方法を見つけることができませんでした。

これを達成する最も良い方法はどれですか? ありがとう

+0

なぜpost_save信号が間違っていると思いますか? – Jingo

+1

@Jingo Djangoは同期フレームワークなので、これらのシグナルは単なるコールバックであり、ビューが実行されてから応答が送信される前に実行され、その後は実行されません。 – Stefano

+0

@Stefano ah :)、明確化のために! – Jingo

答えて

2

したがって、タスクは要求 - 応答サイクルから作業を移動することです。あなたはDjangoのシグナルがこれとは何の関係もないということは間違いありません。あなたはあなたの仕事のためにceleryを試すかもしれません、それはdjangoの要求 - 応答サイクルから仕事を動かすために最も成熟して広く使われている方法のようです。

1

ミハイル氏の答えによれば、セラーリなどのタスクキューは間違いなく良い方法です。

何らかの理由で、非同期タスクが間に合わないことを確認できないため、IPの格納を別のタスクに委ねたくない場合は、少なくともスピードアップすることができますその情報を高速のKey-ValueストアまたはNoSQL DBに保存して格納します。

レディスはすばらしいフィット感があります。モデルのsave()にIP値をRedisに置き、save()を呼び出したモデルのインスタンスの一意の識別子であるキーを使用して呼び出しを追加し、stored_ipという名前のメソッド(またはプロパティ修飾メソッド)を追加します。 Redisから地理的パートナーにIPを送信する必要があるときにIPを引き戻す方法を知っています。ジオの作業が完了したら、Redisからキーをパージして、Redisがメモリ不足にならないようにします。

あなたの現在のコードをあまり変更することなく、その方法で稲妻をすばやく保存する必要があります。

関連する問題