【问题标题】:python storing requests headers as a variable?python将请求标头存储为变量?
【发布时间】:2016-07-14 00:51:52
【问题描述】:

我有

headers = {'content-type': 'application/soap+xml'}

效果很好。但是我希望能够将其指定为参数,因此在我的参数中可以说我有

--wsheaders {'content-type':\s'application/soap+xml'}

这很好

{'content-type': 'application/soap+xml'}

...但是当我这样做时

headers = args.wsheaders

我有很多错误。所以很明显标题不能是一个字符串。但是必须有一种方法可以将其存储在可以在变量中读回的位置?有什么想法吗?

编辑:我不能在参数周围使用单引号。我仍在学习这一点,但似乎在从文件传递参数时,我不能在参数周围使用单引号或双引号,就像 I CAN 一样,但是将字符组合在一起不起作用,而是变成了文字部分没有帮助的论点,因为我在空格之前或之后丢失了所有内容。请参阅附件以了解文件中的内容。

--wsheaders '{'content-type': 'application/soap+xml'}'

使用单引号或双引号时出错

Sync03.py: error: unrecognized arguments: 'application/soap+xml'}'
Sync03.py: error: unrecognized arguments: 'application/soap+xml'}"

所以我改用

--wsheaders {'content-type':\s'application/soap+xml'}

但是在我输入arg之后需要替换\s,但是变量是一个字符串,我又回到了原来的问题。

type=json.loads

在有 \s 时在参数定义中不起作用,因为它是一个无法识别的 json。如果有办法用 argparse 替换 \s 它可能会首先这样做......但我认为那是不可能的。有一个空格,然后有一个 \s

Sync03.py: error: argument --wsheaders: invalid loads value: "{'content-type':"
Sync03.py: error: argument --wsheaders: invalid loads value: "{'content-type':\\s'application/soap+xml'}"

编辑

parser.add_argument('--wsheaders', type=lambda x: json.loads(x.replace('\s', '').replace('\'', '"')))

根据下面的 bschlueter 评论,这工作

【问题讨论】:

  • 如果可以的话,您应该至少发布代码中的错误。
  • '{'content-type': 'application/soap+xml'}' 不起作用,因为内部 ' 与之前的匹配。您需要转义内部字符串才能使其成为有效字符串。 '{\'content-type\': \'application/soap+xml\'}' 将使其成为单个有效字符串,但它不是有效的 json,因为 json 需要双引号。 '{"content-type": "application/soap+xml"}' 是相同数据的有效 json 表示形式。
  • 您绝对可以将 \s 替换为 argparse,只需使用修复输入的自定义类型:parser.add_argument('--wsheaders', type=lambda x: json.loads(x.replace('\s', '').replace('\'', '"')))
  • bschlueter - 最后一种使用替换添加参数的方法有效!谢谢!我不确定到底如何。我知道替换是如何工作的,因为我正在对返回的数据进行 50 次替换,但我以前从未使用过“type=lambda x:”。

标签: python web-services python-requests request-headers


【解决方案1】:

假设您在 python 脚本中以某种方式使用 --wsheaders 作为参数,您需要做的就是在将标题传递给脚本时引用它们:

the_script --wsheaders '{"content-type": "application/soap+xml"}'

然后将它们解析为 json 以获取字典。

使用pyyaml:

>>> import yaml
>>> yaml.load(args.wsheaders)
{'content-type': 'application/soap+xml'}

编辑:

如果您正在使用 argparse(应该如此),您可以在解析 args 时通过声明参数轻松地进行解析:

parser = argparse.ArgumentParser()
parser.add_argument('--wsheaders', type=json.loads)
args = parser.parse_args()

【讨论】:

  • 什么?投反对票的人能否解释一下他们的推理?
  • 不知道为什么要投反对票,但效果很好。直到现在才真正知道 yaml 是什么。我希望能够在不添加另一个包(yaml)的情况下做到这一点,就像在使用这个脚本的实时环境中一样,安装外部的东西很困难。甚至不能在那里使用点子。但是您所说的适用于 pyaml 的内容安装了 yaml 的导入。将不得不找到一种独立的方式来安装它非常感谢!
  • Yaml 是 json 的超集,我的 shell 默认会加载它,因此它比 json 更容易获取。显然,json.loads(args.wsheaders) 也可以。
  • 嗯,编辑似乎对我不起作用。我得到:sync.py:错误:参数--wsheaders:无效加载值:“{'content-type':\\s'application/soap+xml'}”冒号后的空格是我的arg中的\s。我不能在它周围使用“”或“”,因为它在属性文件中读取“”作为 arg 的一部分,并且只在空格之前使用东西,所以我需要用 \s 填充它并稍后替换它. 但它现在不会接受那个 arg 因为它里面有 \s
  • 你不能使用带单引号的 json.loads
【解决方案2】:

我假设你使用了argparse

实际上argparse 使用sys.argv 将传递的参数捕获为字符串。因此,在这种情况下,您将 dictionary 作为字符串传递,因此您需要将其解析为字典,因为 requests 需要将标头作为字典。

因此headers = args.wsheaders 是无用的,因为args.wsheaders 是字符串。您需要使用jsonast 将其解析为字典,如下所示-

headers = ast.literal_eval(args.wsheaders)

有关将字典作为命令行参数传递并在hereherehere 正确解析它们的更多详细信息。

【讨论】:

  • 这并没有说明标头是如何传递给脚本的。
  • @bschlueter 看到--wsheadersargs.wsheaders假设他使用命令行参数传递使用argparse 如上所述。
  • 对,但是 OP 描述的将参数传递给 --wsheaders 的方式必然会失败,因为 shell 会将它传递给 python。
  • 是 argparse,是的,它是一个命令行参数。虽然我在一个文件中指定了大约 30 个参数,所以我通过 --file filename.properties 加载它们,但我假设这些参数与在命令行中手动键入它们相同。即如字符串所述。虽然从文件加载时我不能在 args 周围使用“”,所以像 \s 这样的空格需要稍后替换,这有点烦人。尤其是身体方面。谢谢你的信息,我明天醒来一定会读到这篇文章,这样我会更好地理解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多