2013-03-16 5 views
74

मैंमैं कैसे अक्षम करूं अजगर में सुरक्षा प्रमाणपत्र की जांच का अनुरोध करता है

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

उपयोग कर रहा हूँ, लेकिन मैं एक request.exceptions.SSLError मिलता है। वेबसाइट की समय सीमा समाप्त हो चुकी है, लेकिन मैं संवेदनशील डेटा नहीं भेज रहा हूं, इसलिए इससे कोई फर्क नहीं पड़ता। मुझे लगता है कि 'verifiy = false' जैसे तर्क हैं जो मैं उपयोग कर सकता हूं, लेकिन मुझे यह प्रतीत नहीं होता है।

उत्तर

146
the documentation से

:

अनुरोध भी अगर आप verify गलत पर सेट की एसएसएल सर्टिफिकेट की पुष्टि करने की उपेक्षा कर सकते हैं।

>>> 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

धन्यवाद, यह काम करता है अगर आप कुछ अनुरोध है अपने खुद के कोड के अंदर कहता है, लेकिन कल्पना करें कि मैं इसे तीसरे आंशिक रूप से लाइब्रेरी में अक्षम करना चाहता हूं जो अनुरोधों का उपयोग करता है ... इस तरह की तीसरी पार्टी lib को ठीक करना असंभव होगा। – sorin

+6

@ सोरीन: बस बंदर पैच 'अनुरोध' और 'गलत' को 'सत्यापित करें' डिफ़ॉल्ट है। – 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 अनुरोध किया जा रहा है"। लेकिन 'सत्यापित करें = गलत 'को वैसे भी उपस्थित होना चाहिए। Tnx। – Lufa

+1

और सभी चेतावनियों को छिपाने से बचने के लिए: 'urllib3.exceptions से आयात करें IsecureRequestWarning' फिर 'request.packages.urllib3.disable_warnings (श्रेणी = InsecureRequestWarning)' –

3

कि वास्तव में आप भेजने के लिए की पुष्टि = झूठी विकल्प के साथ अनुरोध पोस्ट चाहते हैं, सबसे तेज़ तरीका है इस कोड का उपयोग करने के लिए है:

import requests 

requests.api.request('post', url, data={'bar':'baz'}, json=None, verify=False) 
संबंधित मुद्दे