requests-cache多接口过期时间配置异常及匹配行为咨询
问题解答
一、调整字典顺序和URL格式解决问题的原因
requests-cache中CachedSession的urls_expire_after是按字典插入顺序进行匹配的,且第一个匹配成功的规则直接生效,不会继续检查后续规则。
举个例子,如果初始配置是:
urls_expire_after = { "/endpoint1": 3600, "/endpoint1/*/endpoint2": 600 }
当请求/endpoint1/abc/endpoint2时,/endpoint1是请求URL的前缀,且排在字典前面,会被优先匹配,因此会使用3600秒的过期时间,而非更精确的/endpoint1/*/endpoint2规则。
调整顺序后,把更具体的规则放在前面:
urls_expire_after = { "/endpoint1/*/endpoint2": 600, "/endpoint1": 3600 }
此时请求URL会先匹配到更精确的规则,自然就用对应的600秒过期时间。
另外,如果之前的URL格式缺少开头的/(比如写成endpoint1/*/endpoint2),会和请求URL的路径结构不匹配,导致规则失效;补上/后,路径结构对齐,就能正确匹配。
二、自定义缓存规则的实现方案
如果内置的urls_expire_after匹配逻辑满足不了需求,可以通过以下两种方式实现自定义过滤:
1. 自定义expire_after回调函数
给expire_after传入一个回调函数,函数接收request对象作为参数,根据请求属性返回对应的过期时间(秒),或返回None表示不缓存该请求。
示例代码:
from requests_cache import CachedSession import re def custom_expire_rule(request): url = request.url # 用正则匹配 /endpoint1/任意分段/endpoint2 路径 if re.match(r".*/endpoint1/.+/endpoint2$", url): return 600 # 匹配所有 /endpoint1 开头的路径 elif url.startswith("https://your-api.com/endpoint1"): return 3600 # 默认过期时间 else: return 300 session = CachedSession( cache_name='api_cache', expire_after=custom_expire_rule )
2. 结合filter_fn实现复杂缓存逻辑
如果需要更复杂的判断(比如结合请求方法、请求参数等),可以使用filter_fn参数,它接收request对象,返回True(缓存该请求)或False(跳过缓存),配合expire_after使用。
示例代码:
def custom_cache_filter(request): # 仅缓存GET请求,且URL包含指定端点 if request.method != 'GET': return False return any(endpoint in request.url for endpoint in ["/endpoint1", "/endpoint2"]) session = CachedSession( cache_name='api_cache', expire_after=custom_expire_rule, # 复用上面的过期规则 filter_fn=custom_cache_filter )
内容的提问来源于stack exchange,提问作者LiiVion
相关产品推荐
相关产品推荐

