Python请求调用未按预期处理身份验证

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,因为它无法识别身份验证。但是,如果我这样

我有一个列表,其中放置了请求get调用的url和身份验证参数。如果我以这种方式尝试调用,我会得到身份验证错误(401),但是如果我在调用中显式地中断了身份验证,则一切正常。为什么我不能以这种方式包含auth,并期望它在调用中正确地“爆炸”

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中,位置参数必须放在命名参数之前

谢谢-这很有帮助。如果可以的话,还有一个问题,我正在从数据库中提取身份验证信息,“('UID','PWD')”部分。但是当它来自数据库时,它是一个字符串。似乎传递到字典的内容本身不是字符串(在值('UID','PWD')周围没有单引号。如果我将数据库结果放入字典,则会出现错误“TypeError:'str'对象不可调用”。如何将数据库字符串转换为任何调用的字符串,以便在字典中正确地获取它?我解决了第二个问题-我执行以下操作-kwargs['auth']=ast.literal_eval(header[2])。这会将请求调用工作所需的表示形式放入字典值中。很好!
ast.literal_eval
是安全的(切勿对用户提供的数据使用普通的
eval