Django でトランザクションコミット後にコードを実行する
-
09-09-2019 - |
質問
Djangoでトランザクションコミット後にコードを実行する方法はありますか?
オフライン処理のためにいくつかのメッセージを Rabbitmq サーバーに送信する必要がありますが、メッセージは Django トランザクションがコミットされる前にコンシューマーに届きます。
私のメッセージはモデルの post_save シグナルで送信されます。私が探しているのは、シグナルなどを使用して、コミット後にコードを実行する (トランザクションが失敗した場合は何もしない) 同様のメカニズムです。
Django でそれを行う一般的な方法は見つかりませんでした。あなたはなにか考えはありますか?
解決
更新 2:django-transaction-hook は Django コアにマージ Django バージョン 1.9 でリリースされました。
アップデート: django-トランザクションフック この問題を解決します。
これを行うためのきれいな方法があるとは思えません。少なくとも私には思いつきません。django.db.transaction.commit をモンキーパッチしてカスタムシグナルを送信できます。あまりきれいではありませんが、うまくいくと思います。
このユースケースを django-developers メーリングリスト. 。開発者は通常、新しいシグナルの追加を嫌がりますが、ここに良いケースがあるかもしれません (コア開発者からの反論には、状況を解決するための有用な提案が含まれている可能性があります)。ただし、1.1 がリリースされるまで待ったほうが、応答が得られる可能性が高くなります。
他のヒント
が、これはDjangoの1.9以降を使用して誰かを助けることを願っています。 1.9 ON_COMMIT の以降で使用可能です。
だから、基本的に、あなたはこのようにそれをやっているだろう
from django.db import transaction
transaction.on_commit(
lambda: send_msg_to_rabbitmqp(param1, param2, ...)
)
あなたはpost_save
を維持したい場合、あなたはまだon_commit
を使用することができます:
@receiver(pre_save, sender=MyModel)
def my_handler(sender, instance, created, **kwargs):
transaction.on_commit(
lambda: send_msg_to_rabbitmqp(instance.id)
)
私は猿のパッチ適用ジャンゴで取引信号(post_commit
とpost_rollback
)を実装しました:
http://gist.github.com/247844する
1 つの可能性は、トランザクション ミドルウェアをサブクラス化して、コミット時にカスタム シグナルを送信することです。コードは、post_save ではなく、そのシグナルをリッスンできます。
href="https://github.com/chrisdoble/django-celery-transactions" rel="nofollow">ジャンゴ・セロリ・トランザクションはこれを解決するためにを
私は最近分割アウトを終え、スタンドアローンのアプリ<のhref =「https://github.com/bradleyayers/django-db-signals」のrel =「nofollowを」に基礎となる信号コードコードをリファクタリングしました>ジャンゴ-DB-信号