Bottle-将SimpleTemplate的输出重定向到静态文件

时间:2019-04-06 15:31:25

标签: python bottle

我想为我一直在工作的瓶子站点实现一个缓存系统。这个想法是,两条路线需要花费更长的时间来渲染,因此,如果自生成html文件以来sqlite表尚未更新,我将返回它(如果已更新),则将从数据库并将其保存到文件中并返回。

可能有人已经这样做了,因此,将“ .tpl”模板的输出重定向到“ .html”文件的任何技巧将不胜感激。

我看过一些通用的缓存库,但是它们似乎可以通过按特定的时间间隔刷新缓存来工作,而我想在数据库更改时刷新。

谢谢。

编辑:我使用Apache作为反向代理,将cheroot用作应用服务器。

1 个答案:

答案 0 :(得分:0)

首先,您需要一个缓存对象。字典是一个不错的选择。

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存储的lastupdated列。

@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

如何设置此脉冲取决于您。我使用了一个名为scheduler的python库,并将gevent用于异步应用程序。效果很棒。

现在,您只需调用班级Cache()并向其提供所需的任何数据即可。我的建议是先将其保存在数据库中,然后再返回,而不是返回模板。在渲染之前,让路由调用检查缓存的版本。然后,您可以修改更新以在数据更改时在后台呈现页面,因此对缓存的下一个调用是新数据。