.. module:: requests
这部分文档包含了 Requests 所有的接口。对于 Requests 依赖的外部库部分,我们在这里介绍最重要的部分,并提供了规范文档的链接。
Requests 所有的功能都可以通过以下 7 个方法访问。它们全部都会返回一个 :class:`Response <Response>` 对象的实例。
.. autofunction:: request
.. autofunction:: head
.. autofunction:: get
.. autofunction:: post
.. autofunction:: put
.. autofunction:: patch
.. autofunction:: delete
.. autoexception:: requests.RequestException
.. autoexception:: requests.ConnectionError
.. autoexception:: requests.HTTPError
.. autoexception:: requests.URLRequired
.. autoexception:: requests.TooManyRedirects
.. autoexception:: requests.ConnectTimeout
.. autoexception:: requests.ReadTimeout
.. autoexception:: requests.Timeout
.. autoclass:: Session :inherited-members:
.. autoclass:: requests.Request :inherited-members:
.. autoclass:: Response :inherited-members:
.. autoclass:: requests.PreparedRequest :inherited-members:
.. autoclass:: requests.adapters.BaseAdapter :inherited-members:
.. autoclass:: requests.adapters.HTTPAdapter :inherited-members:
.. autoclass:: requests.auth.AuthBase
.. autoclass:: requests.auth.HTTPBasicAuth
.. autoclass:: requests.auth.HTTPProxyAuth
.. autoclass:: requests.auth.HTTPDigestAuth
.. autofunction:: requests.utils.get_encodings_from_content
.. autofunction:: requests.utils.get_encoding_from_headers
.. autofunction:: requests.utils.get_unicode_from_response
.. autofunction:: requests.utils.add_dict_to_cookiejar
.. autofunction:: requests.utils.cookiejar_from_dict
.. autoclass:: requests.cookies.RequestsCookieJar :inherited-members:
.. autoclass:: requests.cookies.CookieConflictError :inherited-members:
.. autoclass:: requests.codes
>>> requests.codes['temporary_redirect'] 307 >>> requests.codes.teapot 418 >>> requests.codes['\o/'] 200
.. autoclass:: requests.Request :inherited-members:
.. autoclass:: Response :inherited-members:
本节详细介绍 0.x 和 1.x 的主要区别,减少升级带来的一些不便。
Response.json
现在是可调用的并且不再是响应体的属性。import requests r = requests.get('https://github.com/timeline.json') r.json() # 如果 JSON 解码失败,该调用会引发异常。
Session
API 也发生了变化. Sessions 对象不再需要参数了。Session
现在是大写的了,但为了向后兼容,它仍然能被小写的session
实例化。s = requests.Session() # 过去会话需要接收参数 s.auth = auth s.headers.update(headers) r = s.get('http://httpbin.org/headers')
除了'response',所有的请求挂钩已被移除。
认证助手已经被分解成单独的模块了. 参见 requests-oauthlib and requests-kerberos.
流请求的参数已从
prefetch
改变到stream
,并且逻辑也被颠倒。除此之外,stream
现在对于原始响应读取也是必需的。# 在 0.x 中,传入 prefetch=False 会达到同样的结果 r = requests.get('https://github.com/timeline.json', stream=True) for chunk in r.iter_content(8192): ...
requests 方法的
config
参数已全部删除。 现在配置这些选项都在Session
,比如 keep-alive 和最大数目的重定向。 详细程度选项应当由配置日志来处理。import requests import logging # 启用调试于 http.client 级别 (requests->urllib3->http.client) # 你将能看到 REQUEST,包括 HEADERS 和 DATA,以及包含 HEADERS 但不包含 DATA 的 RESPONSE。 # 唯一缺少的是 response.body,它不会被 log 记录。 try: # for Python 3 from http.client import HTTPConnection except ImportError: from httplib import HTTPConnection HTTPConnection.debuglevel = 1 logging.basicConfig() # 初始化 logging,否则不会看到任何 requests 的输出。 logging.getLogger().setLevel(logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True requests.get('http://httpbin.org/headers')
有一个关键的与 API 无关的区别是开放许可从 ISC 许可 变更到 Apache 2.0 许可. Apache 2.0 license 确保了对于 Requests 的贡献也被涵盖在 Apache 2.0 许可内.
和 1.0 发布版相比,破坏向后兼容的更改比较少。不过在这个主发布版本中,依然还有一些应该注意的问题。
更多关于变更的细节,包括 API,以及相关的 GitHub Issue 和部分 bug 修复,请参阅 Cory blog 中的相关主题。
Requests 处理异常的行为有部分更改。
RequestException
现在是IOError
的子类,而非RuntimeError
的子类,新的归类更为合理。此外,无效的 URL 转义序列现在会引发RequestException
的一个子类,而非一个ValueError
。requests.get('http://%zz/') # raises requests.exceptions.InvalidURL
最后, 错误分块导致的
httplib.IncompleteRead
异常现在变成了ChunkedEncodingError
。代理 API 略有改动,现在需要提供代理 URL 的 scheme。
proxies = { "http": "10.10.1.10:3128", # 需使用 http://10.10.1.10:3128 } # requests 1.x 中有效, requests 2.x 中会引发 requests.exceptions.MissingSchema requests.get("http://example.org", proxies=proxies)
headers
字典中的 key 现在都是原生字符串,在所有版本的 Python 中都是如此。也就是说,Python 2 中是 bytestring,Python 3 中是 unicode。 如果 key 不是原声字符串(Python 2 中 unicode,或 Python 3 中 bytestring) 它们会被以 UTF-8 编码转成原生字符串。headers
字典中的 value 应该都是字符串。在 1.0 版之前该项目就是要求这样做的,只不过最近(v2.11.0之后)这条变成了强制条款。建议在可能的情况下,避免让 header 值使用 unicode 编码。