2016-03-09 102 views
7

我正在使用Django 1.9.3。我有一個項目與幾個應用程序。我想在項目啓動時更新其中一個應用程序的表格。Django - 在啓動時執行代碼

用例:

例如,假設我想賣掉我的網站上的項目。我有一個包含模型Item的應用程序。我在Django之外有一個web服務,它提供服務「give_all_items_available()」。我想通過網站向我的用戶提供項目列表。所以我認爲我必須定期更新我的數據庫(在啓動時和每隔一段時間)使用該Web服務輸入。

我把所有的代碼編寫的,它看起來像下面的(這是一個例子):

from my_app.models import My_table 

def on_startup(): 
    my_thread = Thread(execute = populate_tables, loopmode = True, background = True) # thread running in loopmode in background 
    my_thread.start() # starts the thread and returns 

def populate_tables() 
    response = call_webservice() # let's imagine this method returns data for creating a new model instance 
    My_table(response).save() # this save() isn't threadsafe in this example, but that's not my point ;-) 

我的問題是我不知道在哪裏可以編寫代碼

嘗試:

到目前爲止,在Django 1.6.5中,我使用了我的應用的init .py文件中的一些代碼。它正在工作,但我認爲它非常難看(用「導入」開始線程看起來非常像隱藏的代碼)。

我在Django 1.9中看到了「ready()」方法。但它寫在文檔中,不處理這種方法中的模型,所以我很困惑。

我可以在啓動我的服務器的命令中添加啓動代碼,但此啓動代碼是面向應用程序的,在我看來,這些項目與它無關。

你會推薦什麼?

如果需要,我很樂意提供更多信息。

由於提前,

+1

你可能會發現一些有用的[這個stackoverflow問題](http://stackoverflow.com/questions/2781383/where-to-put-django-startup-code)。 – Robin

+0

我已經看到它了,這個鏈接的接受答案提到了像我這樣的「ready()」方法。但根據Django doc,在這種方法中與模型進行交互是一種不好的做法...... –

+3

「啓動」在這種情況下意味着什麼?通常你會開始一個網站,然後繼續運行。爲什麼您需要在「啓動」時填充表格,而不是在遷移中? –

回答

1

爲什麼你不使用Celery呢?我知道你在問起如何在啓動時填充你的Item表,但是......我認爲這裏的一個預定的芹菜任務適合並以自然的方式解決你的問題。

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包括答案的基本部分,提供鏈接供參考。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/11771232) –

+0

@MikeC,我很感謝你的評論,但答案的重要部分包括:「一個預定的任務」,我還包括一個名字我們可以用來解決的工具:芹菜,鏈接只是這個工具的捷徑。 – trinchet

+1

以及芹菜可能是一個選擇,但我認爲Django已經提供了方法來做我需要的東西,而不必依賴芹菜。事實上,我將使用芹菜來改善我的計劃的那一天,然後我會考慮這一點,但我不希望僅僅因爲芹菜而依賴芹菜。管理的東西是我所需要的,我認爲,到目前爲止它的工作 –

相關問題