2010-10-11 49 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关于该主题的开始。通常,如果可行的话,尝试在应用程序启动时生成和存储这些值,而不是在请求期间;如果仅在启动时在主线程中写入此类数据,则每个请求应该可以安全地由多个线程读取。如果您需要这些数据随应用程序状态的改变而改变,那么您可能需要使用一个数据库或其他一些拥有数百年工作时间的机制来使其安全并发。