2010-10-11 79 views
1

我最近discovered CherryPy中的頁面對象屬性在請求之間(和客戶端之間)是持久的。所以我想知道,將頁面輸出存儲在這種屬性中有意義嗎?像這樣:CherryPy緩存如何工作?

class Page: 
    def default(self, pagenumber): 
     if pagenumber not in self.validpages: 
      return 'Page number not found' 
     try: 
      html = self.pageoutput[pagenumber] 
     except KeyError: 
      html = self.formatter(self.dbcall(pagenumber)) 
     return html 
    default.exposed = True 

    def formatter(self, data): 
     html = # Formatting code here 
     return html 

    def dbcall(self, pagenumber): 
     data = # Database lookup code here 
     return data 

默認情況下,我知道CherryPy caches GET requests。在我的測試中,當一個對象屬性是輸出的一部分並且該屬性發生變化時,CherryPy提供了該屬性的新值。這是否意味着輸出僅被部分緩存?

對我來說,只要每次更改數據庫時更新self.pageoutput,這都會很有用。我能想象的唯一困難是如果我想顯示用戶特定的信息。你怎麼看?

回答

4

CherryPy默認不緩存GET請求;您必須按照該文檔中的描述明確打開緩存工具。

要回答你的第一個問題,是的,存儲諸如「pageoutput」之類的東西在呼叫之間不會改變是完全有效的。然而,有幾個注意事項:

  1. HTTP緩存遠遠好於你自己寫的。所以更喜歡整個迴應。
  2. 因此,對部分響應使用臨時緩存,例如模板和橫幅等。
  3. 要非常小心地設計您的存儲安全併發。請參閱effbot's writeup關於該主題的開始。通常,如果可行的話,嘗試在應用程序啓動時生成和存儲這些值,而不是在請求期間;如果僅在啓動時在主線程中寫入此類數據,則每個請求應該可以安全地由多個線程讀取。如果您需要這些數據隨應用程序狀態的改變而改變,那麼您可能需要使用一個數據庫或其他一些擁有數百年工作時間的機制來使其安全併發。