如何正确使用requests-cache的filter过滤器,不缓存含指定字段的响应
问题原因
- 核心错误:过滤函数的匹配条件使用了HTML转义后的引号
",但实际response.text中存储的是原生双引号",匹配逻辑永远无法命中,函数始终返回True,导致所有响应都被缓存。 - 可优化隐患:直接用字符串匹配JSON字段容易受格式影响,比如键值中间存在空格、换行时会匹配失败,容错性较低。
- 额外参数拼写错误:
install_cache方法中设置缓存有效期的参数应为expire_after,你当前写的expired_after多了后缀d,会导致缓存过期规则不生效(非本次报错的直接原因)。
修复方案
快速修复(直接修正匹配字符串)
直接将过滤函数中的转义引号替换为原生双引号即可:
def phrase_filter(response: requests.models.Response)->bool: if '"incomplete_results":true' in response.text: return False return True
更鲁棒的方案(解析JSON后判断)
如果响应固定为JSON格式,建议先解析为字典再判断,避免格式问题导致的匹配失效:
def phrase_filter(response: requests.models.Response)->bool: try: resp_json = response.json() # incomplete_results为True时返回False,不缓存 return not resp_json.get("incomplete_results", False) except Exception: # 非JSON格式响应可按需调整返回值,此处默认缓存 return True
修改后重新运行测试即可通过断言。
内容的提问来源于stack exchange,提问作者Nguyen Thai
相关产品推荐
相关产品推荐

