Как реализовать кеширование с помощью WSGI? - PullRequest
2 голосов
/ 25 февраля 2011

Я хотел бы создать прокси-сервер для кэширования в качестве промежуточного программного обеспечения Python WSGI и удивляться, как это промежуточное программное обеспечение может определять, не истек ли срок хранения кэшированной страницы.Насколько я знаю, WSGI не поддерживает что-то вроде getLastModified (HttpServletRequest req) метода Java-сервлетов.

Что мне не нужно, так это стратегия кэширования для каждого клиента с "если изменено с "или" etags ".Я хочу кешировать контент для всех клиентов, как прокси-сервер.Таким образом, кэш должен проверять, было ли изменено приложение WSGI или ресурс с точки зрения REST и, таким образом, срок его действия в кеше истек.

 client               cache               wsgi app
 ------               -----               --------
    |   get /some/x     |                    |
    |------------------>| /some/x expired?   |
    |                   |------------------->|
    |                   |                    |
    |                   | update /some/x     |
    |                   | if modified        |
    | return /some/x    |<-------------------|
    |<------------------| 

Возможно ли реализовать его без обхода WSGI?

Ответы [ 3 ]

3 голосов
/ 27 февраля 2011

Конечно можно. Прежде всего, только вы знаете, истек ли ресурс или нет, ресурс может быть из файла, статьи из базы данных, поэтому для вас не будет метода «истек или нет» юниверса. Вот простой пример:

class WSGICache(object):

    def __init__(self, app):
        self.app = app
        self.cache = {}

    def is_expired(self, environ):
        """Determine is the resource the request for already expired?

        """
        # FIXME: check is the resource expired, by looking
        # PATH_INFO, if it is a file, it might be last modified time
        # if it is an object from database, see what is the last modified time
        return False

    def __call__(self, environ, start_response):
        path = environ['PATH_INFO']
        cached = self.cache.get(path)
        # do we have valid cache?
        if self.is_expired(environ) or not cached:
            cached = list(self.app(environ, start_response))
            self.cache[path] = cached
        return cached

Но для производственного использования я предлагаю использовать уже встроенную систему кэширования, такую ​​как Beaker , я думаю, что она должна быть достаточно хороша, чтобы делать то, что вы хотите. Я не тестировал приведенный выше код, но промежуточное ПО, подобное этому, сможет делать то, что вы хотите.

1 голос
/ 25 февраля 2011

Когда вы говорите «построить», вы имеете в виду настраивать или разрабатывать его самостоятельно. Дело в том, что существует множество инструментов для кеширования HTTP. Я бы порекомендовал вам взглянуть на:

  1. Оптимизация веб-доставки
  2. или mod_cache в Apache

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

Для WSGI здесь у вас есть пример конфигурации с SQUID Cache

0 голосов
/ 24 мая 2014

Можно попробовать полка . https://docs.python.org/2/library/shelve.html

Если вы хотите использовать его для кэширования веб-страниц, вы можете сохранить код веб-страницы на полке или в кэше, а затем вернуть его клиенту и попросить wsgi изменить страницу при необходимости.

...