python将请求头存储为变量吗?

时间:2016-03-26 09:57:06

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

我有

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

工作正常。但是我希望能够将其指定为参数,所以在我的args中可以说我有

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

这很好,因为

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

......但是当我这样做时

headers = args.wsheaders

我收到了很多错误。很明显,标题不能成为字符串。但是必须有一种方法可以将它存储在可以在变量中读回的地方吗?有什么想法吗?

编辑:我不能使用参数周围的单引号。我还在学习这个但是看起来我不能在从文件中传递参数时使用单引号或双引号,就像我可以但是它不能将字符组合在一起,而是变成字面部分由于我在空间之前或之后丢失了所有内容,所以这个参数没有用。请参阅附件,了解文件中的外观。

wsheaders in properties file

--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评论工作

2 个答案:

答案 0 :(得分:1)

我假设您使用了argparse

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

出于这个原因,headers = args.wsheaders没用,因为args.wsheaders是字符串。您需要使用jsonast将其解析为字典,如下所示 -

headers = ast.literal_eval(args.wsheaders)

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

答案 1 :(得分:0)

假设您以某种方式在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()