2

トランザクションマネージャーが戻った後、myscript.pyを実行するにはどうすればよいですか。さらに、スクリプトがブロックされていない方がいいと思います。

私の見解では、POSTからファイルを受信して​​います。repoze.filesafe'sを使用してファイルを作成してcreate_file()いるため、トランザクションマネージャーが戻るまでファイルは一時的な場所に保持されます。このファイルは、トランザクションマネージャがエラーなしで戻った後、ハードディスクの正しいパスにのみ存在します。

したがって、トランザクションマネージャーが戻った後にスクリプトを実行する必要があります。

4

1 に答える 1

2

transactionパッケージを介して、コミット後に実行されるフックを登録できます。ビューに1つ登録します。

import transaction


def your_after_commit(success, arg1, arg2, kwarg1=None, kwarg2=None):
    if success:
        print "Transaction commit succeeded"
    else:
        print "Transaction commit failed"


def someview(request):
    current_transaction = transaction.get()
    current_transaction.addAfterCommitHook(your_after_commit, args=(1, 2), kws={kwarg1='foo', kwargs2='bar'})

これにより、現在のリクエストのコンテキストでスクリプトが実行されます(たとえば、スクリプトが戻るまでリクエストは完了しません)。完全な非同期セットアップが必要な場合は、Celeryなどの適切な非同期ソリューションに移行する必要があります。トランザクションフックでは使用しません。代わりに、実行するタスクをCeleryに登録するだけです。

于 2013-03-24T11:22:22.537 に答える