我需要缓存一些生成的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代码前面使用其他服务,因为应用程序应该独立运行。
答案 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
。)
如果你坚持自己滚动,那么:你使用包装器(装饰器)缓存的高级想法似乎是合理的;但你的实施需要工作。它没有到期,并且它没有干净地考虑完整的缓存键集(应该包括操作(函数或路由)以及所有参数)。