2009-12-09 96 views
2

how to update a Django page without a page reload?所述,我使用JavaScript從瀏覽器定期發送XMLHTTP請求到服務器,以獲取在我的應用程序過程中發生變化的那些網頁部分。如何僅在需要時自動更新Django頁面?

但是,大部分時間沒有什麼變化;服務器回覆相同的響應,瀏覽器用已經存在的內容更新網頁。

顯然,服務器應該只在有新數據時纔會回覆。

徹底的網絡研究提出了http://ajaxpatterns.org/Periodic_Refresh#Lace,但dcoumentation是簡潔的,我努力在我的Django項目中實現這個概念。我很難相信這一點以前沒有做過。

有沒有人知道我可以用作指南的任何其他資源?

+1

您鏈接到的頁面有一個很好的技術:散列內容,在響應中包含散列,在定時器上將散列發​​送到服務器,並讓服務器檢查散列以知道是否發送更多內容。你需要什麼幫助? – 2009-12-09 20:40:21

回答

7

回答困難在於不知道正在返回給用戶的服務器端資源是什麼。

我會編一些可以作爲例子。假設您開發的應用程序允許您實時監控您網站上的用戶發表的評論。我們可以採取一些措施來實現這一目標:

  1. 的服務器跟蹤評價時,加入(.created場)
  2. 獲得的最新評論API需要我們指定我們的意見如何老想的
  3. 從那時起

models.py

class Comment(models.Model): 
    text = models.TextField() 
    created = models.DateTimeField(default=datetime.now()) 
0已添加的視圖查詢並返回只有那些

urls.py

url(r'^comments/latest/(?P<seconds_old>\d+)/$',get_latest_comments), 

views.py

def get_latest_comments(request, seconds_old): 
    """ 
    Returns comments that have been created since the last given number of seconds 
    have elapsed. 
    """ 

    # Query comments since the past X seconds 
    comments_since = datetime.datetime.now() - datetime.timedelta(seconds=seconds_old) 
    comments = Comments.objects.filter(created__gte=comments_since) 

    # Return serialized data or whatever you're doing with it 
    return HttpResponse(simplejson.dumps(comments),mimetype='application/json') 

在客戶端你得到的JSON,檢查它是否有一個值,如果是這樣列舉的項目,並添加新的項目到您的<div>標籤或任何其他。


正如您所看到的,開發僅返回最近更新項目的API將根據服務器返回的內容而有所不同。

從你的問題,它聽起來像你想要服務器管理識別最近更新,而不是客戶端(這是一個很好的策略)。在這種情況下,你需要做的是定義:

  1. 是怎樣的服務器將跟蹤(這是由「創造」領域所做的在我的例子)
  2. 如何在客戶端將改變請求這些更改
  3. 服務器如何確定發生了哪些更改以便通過API將它們返回給客戶端?
+0

非常感謝您花時間提供這樣一個詳細的答案!我認爲我的問題是我主要了解這些作品,但看不出它們是如何結合在一起的。 我的應用程序現在大部分工作,只是一些細節(關於我可能會要求在另一個問題的幫助;-) 再次感謝!做得好! – ssc 2009-12-11 09:30:03