在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数据?
答案 0 :(得分:3)
我在评论中运行确切代码时看到的内容是 first Authorization
中缺少print
标头,但它出现在第二。这似乎与您报告的问题相反。
这可以解释为第一个请求被301响应重定向,并且auth头不会在后续请求中传播到重定向位置。通过查看response.history[0].request.headers
,您可以看到auth标头已在初始请求中发送。
第二个请求未被重定向,因为会话已保持与主机的连接打开(由于Connection: keep-alive
标头),因此当您print response.request.headers
时会显示身份验证标头。
我怀疑你实际上是在使用https://test.com,但可能与你正在使用的服务器发生了类似的事情。
为了测试,我建议使用非常方便的公共测试HTTP服务器https://httpbin.org/headers。这将返回服务器在响应正文中收到的标头。您可以使用其中一个重定向网址测试重定向的请求。
答案 1 :(得分:0)
我没有找到关于如何在 python 中进行请求会话时传递身份验证信息的任何可靠答案。下面是我的发现:
with requests.sessions.Session() as session:
session.auth = ("username", "password")
# Make any requests here without provide auth info again
session.get("http://www.example.com/users")