专业会话

该工具包在 requests_toolbelt.sessions 模块中提供专业会话类。

class requests_toolbelt.sessions.BaseUrlSession(base_url=None)

一个使用 URL 作为所有请求基础的会话。

让我们从查看几个示例开始

>>> from requests_toolbelt import sessions
>>> s = sessions.BaseUrlSession(
...     base_url='https://example.com/resource/')
>>> r = s.get('sub-resource/', params={'foo': 'bar'})
>>> print(r.request.url)
https://example.com/resource/sub-resource/?foo=bar

我们对 get 方法的调用将在创建会话时传入的 URL 和我们提供的部分资源名称中发出请求。我们通过覆盖会话的 request 方法来实现这一点。

同样,我们覆盖 prepare_request 方法,以便您可以用相同的方式构建一个 PreparedRequest

>>> from requests import Request
>>> from requests_toolbelt import sessions
>>> s = sessions.BaseUrlSession(
...     base_url='https://example.com/resource/')
>>> request = Request(method='GET', url='sub-resource/')
>>> prepared_request = s.prepare_request(request)
>>> r = s.send(prepared_request)
>>> print(r.request.url)
https://example.com/resource/sub-resource

注意

您提供的基本 URL 和您提供的路径非常重要。

让我们看另一个类似的示例

>>> from requests_toolbelt import sessions
>>> s = sessions.BaseUrlSession(
...     base_url='https://example.com/resource/')
>>> r = s.get('/sub-resource/', params={'foo': 'bar'})
>>> print(r.request.url)
https://example.com/sub-resource/?foo=bar

这里的关键区别在于我们使用 /sub-resource/ 调用了 get,即存在一个前导 /。这改变了我们创建 URL 的方式,因为我们依赖于 urllib.parse.urljoin

要覆盖我们生成 URL 的方式,请对该方法进行子类化并覆盖 create_url 方法。

基于 https://github.com/kennethreitz/requests/issues/2554#issuecomment-109341010 中的实现。

create_url(url)

根据此部分路径创建 URL。

prepare_request(request, *args, **kwargs)

在生成完整 URL 后准备请求。

request(method, url, *args, **kwargs)

在生成完整 URL 后发送请求。

BaseUrlSession

0.7.0 版中的新增功能。

许多人编写了会话子类,允许指定“基本 URL”,因此所有未来的请求无需指定完整 URL。为了创建一个简化且易于配置的版本,我们已将 requests_toolbelt.sessions.BaseUrlSession 对象添加到工具包中。

requests_toolbelt.sessions.BaseUrlSession