2016-12-28 33 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())