2009-11-18 132 views
0

我的應用程序在Django 可以創建一些非常大SQL查詢。我目前使用HttpRequest對象來獲取我需要的數據,然後使用HttpResponse來返回我想要顯示的用戶。更新HttpResponse每隔幾秒

顯然,我可以讓用戶等待一分鐘,同時執行這些多組查詢並從數據庫中提取,然後返回這個monolothic HTML頁面。

理想情況下,我想更新頁面時,我想,是這樣的:

For i,e in enumerate(example): 

    Table.objects.filter(someObjectForFilter[i]). 

    #Return the object to the page. 
    #Then Loop again, 'updating' the response after each iteration. 

這可能嗎?

回答

4

我最近發現一個HttpResponse可以是發電機:

def myview(request, params): 
    return HttpResponse(mygenerator(params)) 


def mygenerator(params): 
    for i,e in enumerate(params): 
     yield '<li>%s</li>' % Table.objects.filter(someObjectForFilter[i]) 

這將逐步的mygenerator結果返回到該頁面,包裹在顯示的HTML <li>

2

你的方法有點有缺陷。你有幾個不同的選擇。

第一個可能是最簡單的使用AJAX和HTTPRequest。有一系列的這些,每一個都會導致一個單一的Table.objects.filter(someObjectForFilter[i]).。每完成一次,腳本就完成並將結果返回給客戶端。客戶端更新UI並通過另一個AJAX調用啓動下一個查詢。

另一種方法是使用批處理系統。這有點過於複雜,但如果你要在數據庫中進行真正的「繁重工作」,可能會更好一些。你需要運行一個批處理守護進程(一個cron探針可以很好地工作)來掃描傳入的任務。用戶想要執行某些操作,因此他們的請求會提交此任務(它可能僅僅是數據庫中的一行,並帶有其參數)。守護進程抓取它,完全脫機處理它 - 甚至可能通過不同的機器 - 並在任務行完成時更新任務行。然後,客戶端可以定期刷新以通過傳統或AJAX方法檢查該行的狀態。