在python中使用来自requests
模块的会话,似乎会话仅在第一次请求时发送授权,我无法理解为什么会发生这种情况。
import requests
session = requests.Session()
session.auth = (u'user', 'test')
session.verify = False
response = session.get(url='https://my_url/rest/api/1.0/users')
如果我查找此响应请求标头,我会看到:
{'Authorization': 'Basic auth_data', 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.12.3'}
但如果我使用相同或不同的URL发送下一个请求:
response = session.get(url='https://my_url/rest/api/1.0/users')
我可以看到请求中没有auth标头了:
print response.request.headers
{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.12.3'}
而且我因此得到了401回应。
为什么会这样?会话是否应该在每次使用它的请求时发送auth?如何使用会话发送每个请求的auth数据?
当我在你的评论中运行那些确切的代码时,我看到的是第一个Authorization
中缺少print
标题,但它存在于第二个response.history[0].request.headers
中。这似乎与您报告的问题相反。
这可以通过以下事实来解释:第一个请求被301响应重定向,并且auth头不会在后续请求中传播到重定向位置。您可以通过查看Connection: keep-alive
看到auth标头是在初始请求中发送的。
第二个请求未被重定向,因为会话已保持与主机的连接打开(由于print response.request.headers
标头),因此当您使用https://test.com时会出现auth标头。
我怀疑你实际上是在使用https://httpbin.org/headers,但可能与你正在使用的服务器发生了类似的事情。
为了测试,我建议使用非常方便的公共测试HTTP服务器qazxswpoi。这将返回服务器在响应正文中收到的标头。您可以使用其中一个重定向网址测试重定向的请求。