2016-12-28 71 views
0
context = ssl.create_default_context() 
context.load_cert_chain(certificate, pkey) 
opener = urllib.request.build_opener(urllib.request.HTTPSHandler(context=context)) 
response = opener.open(url, data=None) 
print(response.read()) 

执行与数据上述代码=无自动设置方法来获得,而数据设定为别的自动设置方法,POST。蟒3.X urllib.request.HTTPSHandler重写方法GET POST

有没有办法来覆盖这种行为?

根据文档你可以使用Request.method,但我不知道如何从'opener'引用它。 https://docs.python.org/3/library/urllib.request.html

Request.method

HTTP请求方法来使用。默认情况下,它的值是None,这意味着get_method()将对要使用的方法进行正常的计算。它的值可以通过在Request子类中的类级别设置默认值,或者通过方法参数将值传递给Request构造函数来设置(因此覆盖get_method()中的默认计算)。

版本3.3中的新功能。

版本3.4中已更改:现在可以在子类中设置默认值; >以前它只能通过构造函数参数来设置。

“的方法应该是字符串,其指示将被使用(例如‘HEAD’)。如果提供,其值被存储在该方法属性,并用于通过GET_METHOD()HTTP请求方法,默认如果数据是None或'POST'则是'GET'。子类可以通过在类中设置方法属性来指示不同的默认方法。“

回答

0

如果使用urllib.request.Request可以使用method参数设置要用于此请求的具体method

类urllib.request.Request(URL,数据=无,标题= {}, origin_req_host =无,无法证实=假方法=无

但是 - 当您使用opener你不能提供method

OpenerDirector.open(URL,数据=无[,超时])

没有为open方法没有method参数。


你能做什么 - 是创建一个Request对象,并使用opener发送该请求:

req = urllib.request.Request(url, method='POST') 
res = opener.open(req) 
print(res.read())