如何在不丢失身份验证的情况下模拟Session.request?
在测试使用requests库的Python软件时,建议模拟一下requests.sessions.Session.request
这个功能。
不过,当涉及到HTTP认证时,这种方法似乎效果不太好。我觉得我在模拟requests这个库的一个太高层次的部分。有没有办法可以拦截或模拟请求,这样我就不用自己处理认证,只需要获取合适的头信息就行了?
1 个回答
4
别去模拟 Session
,用 Transport Adapter
吧。=)
Session
对请求进行了大量处理,直接在这个层面上修改它是无法获取到请求的。
相反,你应该写一个 Transport Adapter
,它的 send()
方法可以保存 PreparedRequest
对象。
想要了解更多例子,可以查看 官方文档 和 我写的一篇文章。不过,你可能需要的东西大概是这样的:
from requests.adapters import HTTPAdapter
class TestAdapter(HTTPAdapter):
"""
A Transport Adapter that stores all requests sent, and provides pre-canned responses.
"""
def __init__(self, responses):
self.responses = responses
self.requests = requests
def send(self, request, *args, **kwargs):
self.requests.append(request)
return self.responses.pop(0)
要让这个工作正常,responses
需要是一个 urllib3.Response
对象的列表,或者其他类似的东西,这样 Requests 才能处理。TestAdapter.requests
将会是一个 requests.PreparedRequest
对象的列表。
如果你不想做这么多工作,可以试试 betamax。