【问题标题】:Cache HTML Pages generated by Bottle缓存 Bottle 生成的 HTML 页面
【发布时间】:2014-02-15 00:45:06
【问题描述】:

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

我想过这样的装饰器:

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 代码前面使用其他服务,因为应用程序应该独立运行。

【问题讨论】:

  • 为了获得更多的灵活性,您可以查看dogpile.cache 之类的内容。

标签: python caching bottle


【解决方案1】:

您是否考虑过只使用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。)

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

【讨论】:

  • 但这只是客户端,我需要一个服务器端缓存。
  • 为什么? (无论如何,Last-modified 和 E-tag 由服务器处理。)
猜你喜欢
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多