2016-05-30 195 views
0

以下是我想要在django視圖中執行的操作。django視圖中while循環替代time.sleep

import requests, time 
def SOME_VIEW_FOR_AJAX(request): 
    if request.is_ajax(): 
     response = requests.get('API_URL_START_TASK') 
     # response is like {'ready':false, 'status':'PENDING'} 
     while not response['ready']: 
      response = requests.get('API_URL_CHECK_TASK') 
      time.sleep(1) 
     result = response.get() 
     # SOME MORE WORKS ... 
通過API

(芹菜是其他PC​​上),這種觀點發起芹菜任務,不斷檢查任務的狀態,並得到結果,如果任務完成。

這裏我關心time.sleep的存在。 This SO POST表示使用time.sleep不合適,因爲它包含當前線程。使用django視圖有可能替代time.sleep嗎?還是允許使用time.sleep這樣的用法?

我正在使用Django 1.8.6,Apache 2.4與mod_wsgi,Windows Server 2012 R2。提前致謝。

回答

1

這是錯誤的方法。 Celery的重點是卸下長時間運行的任務,以免延遲響應。

相反,您應該立即返回一個保留響應,然後讓您的前端(可能通過Ajax)定期請求一個狀態,可能是從另一個角度來看。

+0

是的,我用ajax調用芹菜,這工作得很好。但是我擔心安全問題,因爲有人可以通過HTML/JS源代碼來訪問api url。這就是爲什麼我想出了這個服務器端檢查。當然,上面的視圖函數是針對ajax調用的。 – Leonard2

+1

實際上並沒有看到您的代碼如何解決您可能遇到的任何安全問題。 ajax調用會通過url請求一個視圖,並且你可以在服務器端進行auth檢查(login_required,permission等)。您可以按Daniel的建議定期通過ajax進行檢查。 – keni

+0

@keni感謝您的評論。我是關於這樣的事情的;帶有芹菜的機器必須允許CORS頭的所有域,因爲這臺機器應該爲客戶做出響應。所以我很擔心有人可能會因爲重複的Ajax請求而惡意負載機器。我會在服務器端檢查身份驗證! – Leonard2

-1

在答案和評論之後,謝天謝地,我留下了一些後來使用的記錄。

正如Daniel的回答所說,芹菜的使用不是在服務器的某些計算過程中等待。因此,前端投擲和檢查芹菜任務是很自然的。

而且,在JavaScript中暴露url並不是安全問題。根據This SO postthat,我可以將api網址視爲單個網頁的網址,這是衆所周知的,並且許多請求不會給服務器造成負擔。

在我分別爲主Web服務和計算的兩臺服務器分開的情況下,應該配置CORS頭。 This SO post請注意,當您爲與主機不同的域調用ajax時,jQuery不會設置適當的標頭,因此request.is_ajax()不起作用。在ajax代碼中的crossDomain: false將解決這個問題。

我仍在搜索並找出服務器端的安全性......正如肯尼所說,This可能會有所幫助。

我想我的問題沒有很好地總結我的擔心,所以我想在這裏做。任何提示將受到歡迎。