2012-11-14 39 views
2

我正在從Google App Engine服務器提供一些JSON內容。我需要爲ETAG提供內容,以瞭解自上次加載數據以來是否發生了更改。然後我的應用程序將刪除其舊數據並使用新的JSON數據填充其視圖。如何在Google App Engine for Python上設置ETAGS?

self.response.headers['Content-Type'] = "application/json; charset=utf-8" 
    self.response.out.write(json.dumps(to_dict(objects,"content"))) 

什麼是最佳實踐來設置響應的ETAG?我是否必須自己計算ETAG?或者它是一種讓HTTP協議做到這一點的方法?

回答

4

如果您使用的是webapp2,它可以自動添加基於響應正文的md5 ETag。

self.response.md5_etag() 

http://webapp-improved.appspot.com/guide/response.html

+5

可惜這樣的e-tag本質上是無用的,因爲你必須重建整個響應體來重新計算它。電子標籤的目的是爲了避免必須這樣做,只是爲了查看響應是否仍然是新鮮的。 –

+3

@MartijnPieters刪除重新生成響應的需求很有用,但減少從服務器發送到客戶端的數據也可以產生非常顯着的影響。 –

4

您必須自己計算電子標籤值。電子標籤是不透明的字符串,只對應用程序有意義。

最佳實踐是將所有確定JSON內容的輸入變量(轉換爲字符串)連接起來;任何如果發生變化都會導致JSON輸出發生變化的東西應該是其中的一部分。如果這些字符串中有任何敏感內容,您不想公開這些值,請改用這些值的MD5哈希值。

例如,在我管理一個CMS應用,頭版有以下電子標籤:

|531337735|en-us;en;q=0.5|0|Eli Visual Theme|1|943ed3c25e6d44497deb3fe274f98a96|| 

,我們關心已經結合一個|符號爲不透明值的輸入變量,但它確實表示了幾個不同的輸入值,例如最後修改的時間戳(數字),瀏覽器接受的語言頭文件,當前的視覺主題以及從瀏覽器cookie中檢索的內部UID(並確定哪些上下文首頁上的內容取自)。如果這些變量中的任何一個會發生變化,頁面可能會有所不同,並且緩存的副本將會過時。

請注意,電子標籤沒有辦法很快就無法驗證。客戶端會將其包含在If-None-Match請求標頭中,服務器應該能夠快速重新計算當前變量的電子標籤頭並查看標籤是否仍然是最新的。如果重新計算的時間與重新生成內容主體的時間相同,則您只需在200 OK響應中保存發送304 Not Modified響應的一小段帶寬,而不是完整的JSON主體。

+0

'米= md5.new() json_dumps = json.dumps(helpers.to_dict(對象, 「內容」)) m.update(json_dumps) self.response.headers ['Content-Type'] =「application/json; charset = utf-8」 self.response.headers ['ETag'] = m.digest() self.response.out.write(json_dumps)' – hakonbogen

+1

@ Hakonbogen:現在你的電子標籤和你的迴應一樣貴,你已經擊敗了它的目的。 –

+0

我只使用ETag來驗證是否必須更改磁盤上存儲的數據,所以無論服務器的價格如何都無關緊要。 – hakonbogen

相關問題