Python请求调用未按预期处理身份验证
我有一个列表,其中放置了请求get调用的url和身份验证参数。如果我以这种方式尝试调用,我会得到身份验证错误(401),但是如果我在调用中显式地中断了身份验证,则一切正常。为什么我不能以这种方式包含auth,并期望它在调用中正确地“爆炸”Python请求调用未按预期处理身份验证,python,python-requests,Python,Python Requests,我有一个列表,其中放置了请求get调用的url和身份验证参数。如果我以这种方式尝试调用,我会得到身份验证错误(401),但是如果我在调用中显式地中断了身份验证,则一切正常。为什么我不能以这种方式包含auth,并期望它在调用中正确地“爆炸” parms = [] parms.append(url) parms.append('auth=(''UID'', ''PWD'')') response = requests.get(*parms) 这导致404,因为它无法识别身份验证。但是,如果我这样
parms = []
parms.append(url)
parms.append('auth=(''UID'', ''PWD'')')
response = requests.get(*parms)
这导致404,因为它无法识别身份验证。但是,如果我这样做,它会起作用。对我来说,这些似乎是一样的。单引号只是为了让字符串正确地附加到列表中而有所不同。我认为第一种方法将产生两个参数——url和auth
parms = []
parms.append(url)
response = requests.get(*parms, auth=('UID', 'PWD'))
第一个相当于以下内容:
requests.get(url, "auth=('UID', 'PWD')")
当你真正想要的时候:
requests.get(url, auth=('UID', 'PWD'))
您必须改用此选项:
args = []
kwargs = {}
args.append(url)
kwargs['auth'] = ('UID', 'PWD')
requests.get(*args, **kwargs)
规则是:
- 当您有
时,您使用的是位置参数,它们进入函数(foo,bar)
*args
- 当你有
你使用命名参数时,它们进入函数(foo=1,bar=2)
**kwargs
- 您可以将两者混合使用,在Python 2中,位置参数必须放在命名参数之前
ast.literal_eval
是安全的(切勿对用户提供的数据使用普通的eval
)