缓存由Bottle生成的HTML页面

时间:2014-02-14 13:13:13

标签: python caching bottle

我需要缓存一些生成的HTML文件,以加快我的webservice的查看过程。我知道哪些信息可以缓存,哪些不可以,但我正在努力实现。

我想到了这样的装饰者:

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 个答案:

答案 0 :(得分: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。)

如果你坚持自己滚动,那么:你使用包装器(装饰器)缓存的高级想法似乎是合理的;但你的实施需要工作。它没有到期,并且它没有干净地考虑完整的缓存键集(应该包括操作(函数或路由)以及所有参数)。