2013-03-24 14 views
1

如何在事務管理器返回後運行myscript.py。另外,如果腳本沒有阻塞,我寧願選擇。如何在Pyramid的事務管理器返回後運行腳本

在我看來,我正在接收來自POST的文件。由於我使用repoze.filesafecreate_file()創建文件,因此它將文件保留在臨時位置,直到事務管理器返回。在事務管理器返回而沒有錯誤之後,該文件僅存在於其正確路徑中的硬盤上。

因此,我需要在事務管理器返回後運行我的腳本。

回答

1

您可以通過登錄transaction package註冊一個掛鉤以便在提交後運行。註冊一個在你看來:

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運行。

+1

就這樣我們很清楚,commit鉤子和請求在同一個線程中運行。如果你的交易被提交,然後你的腳本失敗,你會有一個不好的時間。 – 2013-03-24 17:53:07

+0

我可以避免的唯一方法是知道由'create_file'設置的臨時文件路徑/名稱。 @ MichaelMerickel警告的常用方法是什麼? – Raj 2013-03-24 18:19:34

+0

您可以使用異步設置(如Celery)在交易完成後一次執行任務。 – 2013-03-24 18:37:10

相關問題