Как работает кеширование CherryPy? - PullRequest
1 голос
/ 11 октября 2010

Я недавно обнаружил , что атрибуты объекта страницы в 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 кэширует GET-запросы по умолчанию.В моих тестах, когда атрибут объекта был частью вывода, и этот атрибут изменился, CherryPy обслужил новое значение атрибута.Означает ли это, что выходные данные были только частично кэшированы?

Для меня это будет полезно, если вы обновляете self.pageoutput каждый раз, когда вы меняете базу данных.Единственная трудность, которую я могу себе представить, - это если я хочу отобразить информацию о пользователе.Что ты думаешь?

1 Ответ

4 голосов
/ 12 октября 2010

CherryPy не кэширует GET-запросы по умолчанию; Вы должны явно включить инструмент кэширования, как описано в этой документации.

Чтобы ответить на ваш первый вопрос, да, вполне допустимо хранить такие вещи, как «pageoutput», которые не меняются между вызовами. Однако есть несколько предостережений:

  1. Кэширование HTTP намного лучше, чем то, что вы можете написать самостоятельно. Так что предпочитайте это для целых ответов.
  2. Поэтому используйте специальное кэширование для частей ответов, таких как шаблоны и баннеры, и тому подобное.
  3. Будьте очень осторожны, чтобы ваше хранилище было одновременно безопасным. См. рецензию Effbot на эту тему для начала. В общем, попытайтесь сгенерировать и сохранить такие значения при запуске приложения, если это возможно, а не во время запроса; если вы записываете такие данные в основной поток только при запуске, они должны быть доступны для чтения несколькими потоками для каждого запроса. Если вам нужно, чтобы такие данные изменялись по мере продвижения состояния приложения, вы, вероятно, захотите использовать базу данных или какой-либо другой механизм, на который было потрачено сотни человеко-лет работы, для обеспечения безопасной одновременной работы.
...