2012-02-18 66 views
1

我在django中有一個web服務,我需要儘可能快地爲請求提供服務。每個請求都會更新一個對象。我還保存請求IP地址以便稍後填充地理信息。django:在保存後立即填充對象的額外信息

獲取地理信息是由外部服務提供商完成的。我給他們的IP地址,並獲得地理信息。

所以我想盡可能快地爲用戶請求提供服務,並在創建/更新後立即填充地理信息。 (1-2秒後)

所以我需要一個處理程序,即響應請求後稱爲1-2秒。它應該有更新或創建的對象作爲參數。

我想這不是post_save,但我找不到正確的方法。

這是實現此目標的最佳方法嗎? 謝謝

+0

你爲什麼認爲post_save信號是錯誤的? – Jingo 2012-02-18 14:33:24

+1

@Jingo,因爲Django是一個同步框架;這些信號只是回調,當視圖在響應發送之前執行時執行 - 而不是之後。 – Stefano 2012-02-18 15:42:47

+0

@Stefano啊:),爲澄清! – Jingo 2012-02-18 16:35:35

回答

2

因此,任務是將工作移出請求 - 響應週期。你是正確的,Django的信號與此無關。您可以嘗試celery來完成您的任務,它似乎是將django的請求 - 響應循環移出工作的最成熟和廣泛使用的方式。

1

就像米哈伊爾在他的回答中所說的,一個任務隊列,比如芹菜,絕對是一個很好的選擇。

如果出於某種原因,您不想將IP的存儲轉交給單獨的任務,因爲您無法確定異步任務是否已按時完成,那麼您至少可以加快通過將其保存在快速鍵值存儲或NoSQL DB中來存儲該信息。

Redis可能非常適合。在您的模型的save()中添加一個呼叫,該呼叫將IP值放入Redis中,其中一個密鑰是稱爲save()的模型實例的唯一標識符,然後添加名爲stored_ip的方法(或屬性裝飾方法)或任何知道如何在需要將Redis IP發送給您的地理合作夥伴時從Redis撤回IP。當地理資料完成後,從Redis清除密鑰,以便Redis不會耗盡內存。

以這種方式保存IP應該快如閃電,對當前代碼沒有太大的改變。