flask_cache.Cache.memoize
不合作flask_restful.Resource
这是示例代码:
from flask import Flask, request, jsonify
from flask_restful import Resource, Api
from flask_cache import Cache
app = Flask(__name__)
api = Api(app)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
class MyResource(Resource):
JSONIFY = True
PATH = None
ENDPOINT = None
def dispatch_request(self, *args, **kwargs):
kw = dict(**kwargs)
kw.update(request.args.items())
r = super().dispatch_request(*args, **kw)
if self.JSONIFY:
return jsonify(r)
else:
return r
class DebugResource(MyResource):
PATH = '/debug'
ENDPOINT = 'debug'
@cache.memoize(timeout=30)
def get(self, **kwargs):
print('cache is not used!')
return kwargs
for r in [DebugResource]:
api.add_resource(r, r.PATH, endpoint=r.ENDPOINT)
print('running!')
app.run()
请注意,在get()
我添加了 print 以便我可以看到实际调用代码的时间以及使用缓存值的时间。
我启动服务器然后在浏览器中我去http://localhost:5000/debug?a=1
并重复按f5
。我希望我的函数get
被调用一次,然后使用缓存的值。但是在服务器控制台中,每次按f5
. 所以memoize
不工作。我究竟做错了什么?
编辑:
Resource
我将我的缓存函数从类中移出
@cache.memoize(timeout=30)
def my_foo(a):
print('cache is not used!')
return dict(kw=a, id=id(a))
class DebugResource(MyResource):
PATH = '/debug'
ENDPOINT = 'debug'
def get(self, a):
return my_foo(a)
那行得通。据我所知,问题self
在于每次通话中实际上都是独一无二的参数。问题仍然是,如何在不为我要缓存的每个方法提取附加功能的情况下使其工作?当前的解决方案看起来像是一种解决方法。