2013-03-16 282 views
74

我使用如何禁用

import requests 
requests.post(url='https://foo.com', data={'bar':'baz'}) 

在Python安全證書檢查請求,但我得到一個request.exceptions.SSLError。 該網站有一個過期的證書,但我沒有發送敏感數據,所以對我無關緊要。 我會想象有一個像'verifiy = False'這樣的我可以使用的參數,但我似乎無法找到它。

回答

146

the documentation

請求也可以忽略驗證SSL certficate如果你設置 verify爲False。

>>> requests.get('https://kennethreitz.com', verify=False) 
<Response [200]> 

如果您使用的是第三方模塊,並要禁用的檢查,這裏有一個上下文管理器猴子補丁requests並改變它,以便verify=False是默認和取消警告。

import warnings 
import requests 
import contextlib 

try: 
    from functools import partialmethod 
except ImportError: 
    # Python 2 fallback: https://gist.github.com/carymrobbins/8940382 
    from functools import partial 

    class partialmethod(partial): 
     def __get__(self, instance, owner): 
      if instance is None: 
       return self 

      return partial(self.func, instance, *(self.args or()), **(self.keywords or {})) 

@contextlib.contextmanager 
def no_ssl_verification(): 
    old_request = requests.Session.request 
    requests.Session.request = partialmethod(old_request, verify=False) 

    warnings.filterwarnings('ignore', 'Unverified HTTPS request') 
    yield 
    warnings.resetwarnings() 

    requests.Session.request = old_request 

以及如何使用它的一個例子:

with no_ssl_verification(): 
    requests.get('https://93.184.216.3/') 
    print('It works') 

try: 
    requests.get('https://93.184.216.3/') 
except requests.exceptions.SSLError: 
    print('It broke') 
+6

謝謝,這個工作,如果你有幾個請求自己的代碼中調用,但想象一下,我想在第三部分使用請求的庫中禁用此功能,...這將不可能像這樣修復第三方庫。 – sorin 2013-12-17 18:49:42

+6

@sorin:只是猴子補丁'請求'並且'verify'默認爲'False'。 – Blender 2013-12-18 01:16:08

+2

如何抑制仍然打印的嚴重惡意警告消息? – Michael 2015-01-15 18:33:49

37

使用requests.packages.urllib3.disable_warnings()。

import requests 

requests.packages.urllib3.disable_warnings() 
requests.post(url='https://foo.com', data={'bar':'baz'}) 
+6

當你想擺脫「未經驗證的HTTPS請求正在進行」等警告時,你的回答是有用的。 但是''verify = False''無論如何都必須存在。 TNX。 – Lufa 2016-01-27 11:29:10

+1

並避免隱藏所有警告:'從urllib3.exceptions導入InsecureRequestWarning'然後'requests.packages.urllib3.disable_warnings(category = InsecureRequestWarning)' – 2017-10-04 13:38:43

3

如果您要發送準確發佈與驗證= False選項要求,最快的方法是使用下面的代碼:

import requests 

requests.api.request('post', url, data={'bar':'baz'}, json=None, verify=False)