【问题标题】:How does CherryPy caching work?CherryPy 缓存如何工作?
【发布时间】:2010-10-11 17:34:28
【问题描述】:

我最近discovered 说 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,这将很有用。我能想象的唯一困难是如果我想显示特定于用户的信息。你怎么看?

【问题讨论】:

    标签: python caching get cherrypy


    【解决方案1】:

    CherryPy 默认不缓存 GET 请求;您必须按照该文档中的说明显式打开缓存工具。

    要回答您的第一个问题,是的,存储诸如“pageoutput”之类的内容在调用之间不会发生变化是完全有效的。但是,有几点需要注意:

    1. HTTP 缓存比您自己编写的要好得多。因此,对于整个回复,更喜欢这样。
    2. 因此,对部分响应(例如模板和横幅等)使用临时缓存。
    3. 要非常小心地将存储设计为安全并发。请参阅有关该主题的effbot's writeup 作为开始。一般来说,如果可行,尝试在应用程序启动时生成和存储这些值,而不是在请求期间;如果您仅在启动时在主线程中写入此类数据,则每个请求的多个线程应该可以安全地读取它。如果您需要随着应用程序状态的进展而更改此类数据,您可能希望使用数据库或其他一些经过数百人年工作的机制来使其安全地并发。

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 2011-04-25
      • 2016-02-15
      • 2014-10-06
      • 1970-01-01
      • 2016-09-08
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多