2014-02-14 1 views
0

Мне нужно кэшировать некоторые сгенерированные файлы HTML, чтобы ускорить процесс просмотра моего веб-сервиса. Я знаю, какая информация может быть кэширована, а какие нет, но я борюсь с реализацией.Кэшированные HTML-страницы, созданные Bottle

Я думал о декоратор, как это:

cache = {} 

def cached(c): 
    if c not in cache: 
     cache[c] = {} 
    def cached_wrapper(func): 
     def inner(*args, **kwargs): 
      if args[0] in cache[c]: 
       print("Cache hit --> %s" %cache[c][args[0]]) 
      else: 
       cache[c][args[0]] = func(*args, **kwargs) 
      return cache[c][args[0]] 

     return inner 
    return cached_wrapper 

@route("/some/file/<id>") 
@cached("some-cache") 
def get_some_file(id): 
    # templating goes here... 
    return "[...]" 

, где для этого примера хранения является словарь, но может легко распространяться на файл на основе хранения или базы данных.

Но вопрос в том, что это действительно хорошая идея? Как я могу реализовать кеш для файлов лучше или проще?

Я не хочу использовать другие службы перед кодом python, потому что приложение должно работать автономно.

+1

Для большей гибкости вы можете посмотреть что-то вроде [dogpile.cache] (https://bitbucket.org/zzzeek/dogpile.cache/). – larsks

ответ

0

Вы считаете, что используете только HTTP's built-in caching mechanisms?

bottle.response.set_header('Expires', 'Fri, 14 Dec 2014 09:24:15 GMT') 

Вы также можете установить Last-Modified и проверить хедер If-Modified-Since запрос. (Там также E-tag, вместо Last-Modified.)

Если вы настаиваете на сворачивании своих собственных, то: ваша идея высокого уровня использования обертки (декоратора) в кеше кажется звуковой; но ваша реализация требует работы. Он не имеет срока действия и не учитывает полный набор ключей кеша (который должен включать операцию (функцию или маршрут), а также все аргументы).

+0

, но это только клиент, и мне нужен кеш-сервер. – reox

+0

Почему? (В любом случае, Last-modified и E-tag обрабатываются сервером.) –