使用Python responses库时如何允许访问未Mock的真实接口
你可以通过 responses 库的透传(passthrough)配置实现需求,有两种常用配置方式:
方式1:允许所有未匹配Mock的请求直接访问真实网络
直接在 responses 激活装饰器中添加 allow_passthrough=True 参数即可,所有没有注册Mock规则的请求都会直接走真实网络请求:
import requests import responses @responses.activate(allow_passthrough=True) def my_request(): responses.add(responses.GET, 'http://google.com', body="Hi! Mocked :)") # 走Mock规则 r1 = requests.get('http://google.com') # 未匹配Mock,走真实网络请求 r2 = requests.get('http://bing.com') return r1, r2 r1, r2 = my_request() print(f"Code r1: {r1.status_code}\nCode r2: {r2.status_code}") print(f"r1 content: {r1.text}\nr2 content length: {len(r2.text)}")
正常输出示例:
Code r1: 200 Code r2: 200 r1 content: Hi! Mocked :) r2 content length: 74123
方式2:仅允许指定域名/地址的真实请求(更安全)
如果不想放开所有真实请求权限,可以通过 responses.add_passthru() 方法仅添加需要放行的地址前缀/正则规则,其余未匹配Mock的请求依然会报错:
import requests import responses import re @responses.activate def my_request(): responses.add(responses.GET, 'http://google.com', body="Hi! Mocked :)") # 仅放行bing域名的请求走真实网络,支持前缀匹配或者正则匹配 responses.add_passthru('http://bing.com') # 走Mock规则 r1 = requests.get('http://google.com') # 匹配透传规则,走真实网络请求 r2 = requests.get('http://bing.com') return r1, r2 r1, r2 = my_request() print(f"Code r1: {r1.status_code}\nCode r2: {r2.status_code}")
注意事项
add_passthru支持前缀匹配和正则匹配,如果需要更精细的规则可以传入正则表达式,比如responses.add_passthru(re.compile(r'https://bing.com/query.*'))仅放行bing的查询接口- 注意协议匹配,如果目标地址是HTTPS,需要写对前缀的协议头,否则无法匹配透传规则
内容的提问来源于stack exchange,提问作者Btc Sources
相关产品推荐
相关产品推荐

