python中的session auth

问题描述 投票:0回答:1

在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数据?

python session python-requests
1个回答
3
投票

当我在你的评论中运行那些确切的代码时,我看到的是第一个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。这将返回服务器在响应正文中收到的标头。您可以使用其中一个重定向网址测试重定向的请求。

© www.soinside.com 2019 - 2024. All rights reserved.