You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask接口URL参数变更时返回缓存旧数据问题排查

问题根因

你在接口上使用的@cache.cached(timeout=0)装饰器默认生成缓存键时,仅匹配请求路径,不会把URL携带的查询参数纳入判断逻辑。也就是说不管你ticker、start、end传什么值,只要访问的是/api路径,都会直接命中第一次请求生成的缓存,根本不会执行视图函数内部的参数解析、上游接口请求逻辑。
加上你设置了timeout=0代表缓存永不过期,旧数据会一直被返回,自然出现改参数也拿不到新结果的问题。

修复方法

给@cache.cached装饰器加上query_string=True配置,让缓存键生成时把所有URL查询参数纳入计算,不同参数组合的请求会对应独立的缓存条目,就不会出现参数变更后仍返回旧数据的问题。
修改后的路由装饰器代码如下:

@app.route("/api")
# 新增query_string=True参数
@cache.cached(timeout=0, query_string=True)
def index():
    ticker = request.args.get( 'ticker', None)
    start = request.args.get( 'start', None) #25-04-2022
    end = request.args.get( 'end', None) #25-05-2022
    s = requests.Session()
    # 后续原有业务逻辑不需要改动
    headers =   {'Host':'www.nseindia.com', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language':'en-US,en;q=0.5', 'Accept-Encoding':'gzip, deflate, br','DNT':'1', 'Connection':'keep-alive', 'Upgrade-Insecure-Requests':'1','Pragma':'no-cache','Cache-Control':'no-cache',  }
    url = 'https://www.nseindia.com/'
    step = s.get(url,headers=headers)
    api_url = f"https://www.nseindia.com/api/historical/cm/equity?symbol={ticker}&series=[%22EQ%22]&from={start}&to={end}"
    result = s.get(api_url,headers=headers).json()
    return result
可选优化
  • 如果你不需要永久缓存,可以把timeout调整为实际需要的缓存时长(单位为秒),比如设置timeout=300就是缓存5分钟自动失效,避免上游数据更新后接口长期返回旧数据。
  • 如果后续接口会增加其他不影响返回结果的查询参数,不需要全量query参数参与缓存键计算,可以自定义key生成函数,仅提取ticker、start、end三个参数生成缓存键,减少不必要的缓存条目。
  • 修改完成后重启Flask服务,清空之前生成的错误缓存再测试即可。

内容的提问来源于stack exchange,提问作者Jay shankarpure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:45:58