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

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


person William Linton    schedule 11.10.2010    source источник


Ответы (1)


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

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

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