Flask-RESTPlus Resource类生命周期及@cached_property可用性问询
结论
你完全可以在Flask-RESTPlus Resource 子类中使用 @functools.cached_property 实现单请求内缓存、不跨请求留存的需求。
核心原理
- Flask-RESTPlus的
Resource类继承自Flask-RESTful的同名基类,框架默认设计为:每收到一个路由到对应资源的HTTP请求,就会创建一个全新的Resource子类实例处理该请求,请求处理完成后实例就会被销毁,不会被其他请求复用,刚好匹配你提到的第一种场景。 @functools.cached_property是实例级别的缓存,缓存的值只会存储在当前实例的属性中,不同实例之间的缓存完全隔离。每个请求对应独立的实例,自然就实现了缓存仅在单请求内生效、不跨请求留存的效果,且单请求内多次访问该属性只会执行一次计算逻辑。
代码示例
from functools import cached_property from flask_restplus import Resource, Api api = Api() @api.route('/demo') class DemoResource(Resource): @cached_property def heavy_compute_result(self): # 此处放置高开销逻辑,比如复杂计算、数据库关联查询、第三方接口调用等 print("执行高开销计算") return {"key": "value"} def get(self): # 第一次访问触发计算,控制台会打印“执行高开销计算” res1 = self.heavy_compute_result # 第二次访问直接读取缓存,不会重复触发计算 res2 = self.heavy_compute_result return res1
你可以自行运行上述代码测试,每次请求只会打印一次日志,多次请求之间的缓存互不干扰。
内容的提问来源于stack exchange,提问作者scanny
相关产品推荐
相关产品推荐

