Bottle - Перенаправить вывод SimpleTemplate в статический файл - PullRequest
0 голосов
/ 06 апреля 2019

Я хочу внедрить систему кеширования для сайта с бутылками, над которым я работаю.Идея состоит в том, что для рендеринга пары маршрутов требуется немного больше времени, поэтому, если таблица sqlite не обновлялась с момента создания html-файла, я вернусь, если получу, получу строки избазу данных и сохранить его в файл и вернуть его.

Вероятно, кто-то уже сделал это, поэтому любые советы по перенаправлению вывода шаблона .tpl в файл .html приветствуются.

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

Спасибо.

Редактировать: я использую Apache в качестве обратного прокси-сервера, cheroot в качестве сервера приложений.

1 Ответ

0 голосов
/ 09 апреля 2019

Сначала вам нужен объект кеша.Диктовка - отличный вариант.

cachetpl = {}
lastupdated = time.time()
cache = Cache()

Затем создайте класс для обработки содержимого в вашем файле:

class Cache(object):
    def __init__(self):
        global lastupdated
        self.lastupdated = lastupdated
        global cachetpl
        self.cachetpl = cachetpl

    def keys(self):
        return self.cachetpl.keys()

    def lastupdate(self):
        return self.lastupdate

    def meta(self, clienthash, zipcode=None):
        return self.cachetpl[clienthash]

Затем вам нужно настроить импульс для проверки изменений, возможно, проверяя последний обновленный столбец вашего хранилища SQL.

@staticmethod
def update():
    global cachetpl
    global lastupdated
    if not cachetpl:
        return None, None
    PSQL = ''' SELECT key, meta FROM schema.table WHERE lastupdated >= %s '''        
    changes = db.fetchall(PSQL, lastupdated)
    if changes:
        numchange = len(changes)
        for x in changes:
            cachetpl[x[0]] = x[1]
        lastupdated = time.time()
        return len(cachetpl), numchange
    else:
        lastupdated = nz.now()
        return None, None

Как настроить этот импульс, зависит от вас.Я использую библиотеку Python scheduler и использую gevent для моего приложения для асинхронного.Работает потрясающе.

Теперь вы просто звоните своему классу Cache() и кормите его любыми данными, которые хотите.Я предлагаю, чтобы вместо возврата шаблона вы сначала сохранили его в своей базе данных, а затем вернули его.Пусть вызов к маршруту проверяет наличие кэшированной версии перед ее рендерингом.Затем вы можете изменить обновление, чтобы отображать страницы в фоновом режиме, если данные изменяются, поэтому следующий вызов кеша - это новые данные.

...