python - Flask 缓存 memoize 不适用于 Flask Restful 资源

标签 python caching flask flask-restful flask-cache

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 参数在每次调用中实际上是唯一的。 问题仍然是,如何在不为我要缓存的每个方法提取附加功能的情况下使其工作?当前的解决方案看起来像是一种解决方法。

最佳答案

缓存不起作用,因为您使用了 memoize方法。在这种情况下,它将缓存函数的结果。装饰器对路由( View ,路径)一无所知。

要修复它,您应该使用 cached方法。 @cached 装饰器有参数 key_prefix,默认值 = view/request.path

所以,只需将 @cache.memoize(timeout=30) 更改为 @cache.cached(timeout=30)

关于python - Flask 缓存 memoize 不适用于 Flask Restful 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42721927/

相关文章:

python - 异步服务调用 Python

Python 找不到已安装的 flask 包

python - 如何在python中对文件中的内容进行排序

C#缓存缓存依赖的使用

cocoa-touch - 是否可以防止 NSURLRequest 在请求后缓存数据或删除缓存的数据?

javascript - 使用 CDN 缓存网页的部分内容

python - "stale association proxy, parent object has gone out of scope"与 Flask-SQLAlchemy

python - 有人可以帮我理解 python 中的 for 循环吗

python - 检查 Python 类中必需参数的最佳方法

python - Python 中的 BaseException 子类问题