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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:52:11