python中的session auth

时间:2017-05-17 09:12:49

标签: python session python-requests

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

2 个答案:

答案 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")