2017-03-05 31 views
0

我有一個Django應用程序編寫來處理顯示網頁與模型中的數據基於在URL中傳遞的主鍵,這一切工作正常,Django組件大部分工作完美。在第一個Django開始運行代碼

雖然我的問題是,並且我嘗試了多種方法,例如使用AppConfig,但是我可以如此做,所以當Django服務器啓動時,代碼被調用,然後創建一個單獨的線程,然後監視外部源,將來自該源的有效數據作爲模型記錄到數據庫中。

我有創建模型並將其保存在數據庫中的部分編寫的線程代碼,但我的問題是,如果我嘗試使用AppConfig創建將處理代碼的線程,我會得到一個django.core.exceptions.AppRegistryNotReady:應用程序尚未加載。錯誤並且服務器無法啓動。

哪裏可以放置代碼?我的方法在這個問題上是否不正確?

+0

老實說,我只是把文件放在與保存在URL中傳遞的主鍵的模型相同的目錄中。 –

回答

4

試圖使用線程來解決像Web服務器這樣的阻塞過程是一個痛苦的練習。我之前做過,它很脆弱,經常會產生不可預知的結果。

一個更簡單的想法是創建一個單獨的工作器,它運行在一個完全不同的過程中,您可以單獨啓動。它將具有相同的數據庫訪問權限,甚至可以使用您的Django模型。這就是Heroku這樣的主機如何處理這個問題。它具有能夠單獨測試的額外好處,並且在您處理主Django應用程序時不需要運行。

現在,通過諸如Docker等Vagrant和集裝箱化選項等衆多虛擬化選項,運行並行流程和工作人員變得微不足道。在野外,他們可能會在另一臺服務器上與您的數據庫在不同的服務器上運行。正如評論中提到的那樣,開始一個工作流程可以很容易地委託給一個單獨的Django management command。反過來,這可以很容易地通過您的Web服務器上的gunicorn變成單獨的工作進程。

+1

它將作爲Django管理命令最好地執行並分開運行。 –

+0

我想最後一句話可能會被誤解爲'gunicorn可以設置爲django管理命令',可能需要編輯。 – hurturk

相關問題