2013-03-16 5 views
74

Я используюКак отключить проверку сертификата безопасности в Python просит

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

, но я получаю request.exceptions.SSLError. Веб-сайт имеет истекший certficate, но я не отправляю конфиденциальные данные, поэтому для меня это не имеет значения. Я бы предположил, что есть аргумент типа «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

+6

@sorin: просто патч '' '' '' '' 'обезьяны '' и' verify' по умолчанию 'False'. – Blender

+2

Как подавить большое неприятное предупреждающее сообщение, которое все еще печатается? – Michael

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

+1

И избегать скрытия всех предупреждений: 'from urllib3.exceptions import InsecureRequestWarning' then' request.packages.urllib3.disable_warnings (category = InsecureRequestWarning) ' –

3

Если вы хотите отправить точно отправлять запрос с проверить = False вариант, самый быстрый способ, чтобы использовать этот код:

import requests 

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