2015-10-19 26 views
0

我不確定如何在我的Django應用程序接近一般這個問題創建新模型實例:與API調用在Django

我需要調用的API每n天。我可以進行這個調用並通過Python獲取所需的數據,但是我應該在哪裏放置代碼?

我是否將代碼放在特定的view中,然後將視圖映射到URL,並在我想基於API調用創建新模型實例時調用該URL?

還是我接近這個錯誤的方式?

+1

我想這可能會被視爲「主要基於意見」。如果您搜索「django cron」,您會發現很多解決方案,從您的crontab運行管理命令('manage.py cron')到使用* celery *添加完整的週期性任務。你的解決方案基本上是* webcron *。什麼最適合你取決於你的應用需求和託管環境。 – dhke

+0

但是,如果我使用這些解決方案之一,我應該編寫一個特定的視圖,基本上創建了一個新的模型實例,我試圖創建一個新的實例? –

+1

將週期性操作放入服務層,並可能用['atomic']顯式包裝它(https://docs.djangoproject.com/en/1.8/topics/db/transactions/#django.db.transaction.atomic)獲得交易安全。該視圖僅適用於webcron。 Celery和crontab-command不會將任何東西暴露給Web。 – dhke

回答

2

我通常做的方式是定製Django-admin commands的組合,然後運行他們機智計劃Cron job

您可以以同樣的方式爲您運行自定義命令將運行在默認的:

python manage.py <your_command_name> <your_command_arguments> 
+0

那麼你會把代碼放在一個特定的視圖API調用?那代碼是否會創建一個新的模型實例? –

+1

不在views.py中,但在應用程序文件夾中。根據[docs](https://docs.djangoproject.com/en/1.8/howto/custom-management-commands/),應用程序內的任何管理下的.py文件都可用作django命令 – MauroMSL

1

聽起來像你正在嘗試有一個時間表的工作。 Celery適用於這種情況。

您將創建一個每N天運行一次的任務。在那個任務中,你會把你的代碼調用API並根據需要處理響應。

參考: Celery Periodic Tasks

+0

芹菜是好的,但我更關心的是在哪裏放置邏輯本身。在調用API調用和更新數據庫的特定視圖中?我是否通過從創建的視圖創建模型的新實例來更新數據庫? –

+1

@AdamThompson,你會創建一個tasks.py文件並將你的代碼放入一個已定義的任務中。然後,您將在您的設置中爲該任務創建一個時間表,芹菜節拍將根據您的時間表來處理該任務。如果你想從視圖中手動調用任務,你也可以這樣做。閱讀芹菜文檔,試試看,然後再回來,提出進一步的問題 – keno

1

難道我把代碼中的特定視圖

一個Django view是必須接受的HTTP請求,並返回一個HTTP響應,所以,除非你需要能夠調用你的代碼直通HTTP有沒有點在使用視圖可言的,即使調用你想有一個視圖暴露這段代碼,這並不意味着執行API調用的代碼必須存在於視圖中。請記住,「django應用程序」基本上是一個Python包,因此除了特定於Django的東西(視圖,模型等)之外,您可以放置​​任何您想要的模塊,並在這些模塊上調用您的視圖,自定義命令等。所以,只需爲一個API客戶端編寫一個模塊,並使用一個函數執行fetch/create model instance /任何作業,然後從它有意義的位置調用此函數(查看,由cron作業調用的自定義命令,芹菜任務等等) 。