尝试通过函数参数

时间:2019-11-07 20:50:19

标签: python-3.x keyerror

尝试通过python函数将POST请求发送到API,但我无法遍历字符串列表并将字符串传递给函数。

已在Postman中成功进行了测试(如Postman中所示,请求以“原始正文”的形式向API发送了一个字符串)。将代码从Postman复制到了Python,并验证了它也可以正常工作。问题是,如果我将静态字符串更改为函数的参数,则会得到KeyError,但是如果我仅将参数(它是一个值,而不是键)替换为字符串,则keyerror会消失。 >

这有效...

payload = "{\"ids\":[\"cb5f9a97c0e749ab67409e78b4fcb11d\"]}" works

但是这些都不起作用(请注意右侧的错误代码);尤其是前两个与上面的完全相同...

payload = "{\"ids\":[\"{0}\"]}".format(id) #gives KeyError: '"ids"'
payload = "{\"ids\":[{0}]}".format(id) #gives KeyError: '"ids"'
payload = "{'ids':'[{0}]'}".format(id) #gives KeyError: "'ids'"
payload = "{ids:[\"{0}\"]}".format(id) #gives KeyError: 'ids'

我还尝试修改键/值对中的键(“ ids”),这导致NameErrors。由于这与上面已知的工作示例有所不同,我认为以下尝试不值得继续尝试...

payload = {ids:"[{0}]".format(id)} #gives NameError: name 'ids' is not defined
payload = {ids:"{0}".format(id)} #gives NameError: name 'ids' is not defined
payload = {ids:id} #gives NameError: name 'ids' is not defined

我什至验证了从列表产生的字符串实际上是一个字符串。

下面的完整(相关)代码:

def cs_delete(id):
    print(id)
    url = "https://api.crowdstrike.com/devices/entities/devices-actions/v2"
    querystring = {"action_name":"hide_host"}
    payload = "{'ids':['{0}']}".format(id)
    headers = {
    'Content-Type': "application/json",
    'Authorization': "Bearer " + cs_auth,
    'Accept': "*/*",
    'Cache-Control': "no-cache",
    'Host': "api.crowdstrike.com",
    'Accept-Encoding': "gzip, deflate",
    'Content-Length': "83",
    'Connection': "keep-alive",
    'cache-control': "no-cache"
    }
    response = requests.request("POST", url, data=payload, headers=headers, params=querystring)
    print(response.text)

for host in dfList:
    print(host)
    cs_delete(host)

出于完整性考虑,dfList显示为:

['2a9cf64988e6464f7d2ba7f305a612f3', '5ba4654e1dbe418f7b6361582e3d8f47', '7c6fc20572c241f664813f48bb36c340', 'ccbaf1ebe52042fc6b8269bf86732676']

1 个答案:

答案 0 :(得分:1)

将外部花括号加倍以使其转义,否则format()将期望将输入值应用于外部花括号而不是{0}

>>> id = 'cb5f9a97c0e749ab67409e78b4fcb11d'
>>> "{{'ids':[{0}]}}".format(id)
"{'ids':[cb5f9a97c0e749ab67409e78b4fcb11d]}"