【发布时间】:2017-08-01 00:10:36
【问题描述】:
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 参数在每个调用中实际上都是唯一的。
问题仍然是,如何在不为我要缓存的每个方法提取附加功能的情况下使其工作?当前的解决方案看起来像是一种解决方法。
【问题讨论】:
-
我不知道是谁点击了
downvote来回答你的问题,但我不明白你为什么点击downvote来回答我的问题。我想帮忙,我确信我的解决方案是有效的。你能解释一下你为什么这样做吗? -
抱歉,我点击了
downvote,因为这不是我所期望的,尽管您的解决方案会起作用。我想改回我的投票,但在你编辑你的答案之前我不会被允许这样做。我的意思是我希望我的缓存考虑函数参数并且只考虑它们。所以我可以用同样的方式装饰资源方法和任何其他功能。因此,当缓存使用request.path作为键而不是 args 时,它不适合我。问题是 argself影响缓存键计算并使其在每个请求中都是唯一的。 -
可以回滚
downvote吗?我更新了我的答案。 -
谢谢。祝你发展顺利;)
标签: python caching flask flask-restful flask-cache