如何在不丢失身份验证的情况下模拟Session.request?

3 投票
1 回答
1302 浏览
提问于 2025-04-18 00:27

在测试使用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

撰写回答