首页 > 解决方案 > 将 Session 与 HTTPAdapter 一起使用时,Python 请求不会引发异常

问题描述

我使用 python 监视在我的服务上创建的几个动态 DNS 条目,但由于某种原因,一台主机macmillan.dynamix.pro导致脚本无限期冻结。

下面的代码使用 requests 头方法来获取状态码。第一个 try catch 块不使用 Retry() 对象,并按预期抛出异常。但是,第二个 try catch 块不会引发异常,并且脚本会因使用从创建的 requests.Session() 对象而无限期冻结def requests_retry_session

############################
#  Imports                 #
############################

from urlparse import urlparse
from threading import Thread
from Queue import Queue
import httplib
import re
import urllib2
import socket
import requests # sudo pip install requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# Below comes from https://www.peterbe.com/plog/best-practice-with-retries-with-requests
def requests_retry_session(
        retries=0,
        backoff_factor=1,
        status_forcelist=(500, 502, 504),
        session=None,
):
        session = session or requests.Session()
        retry = Retry(
                total=None,
                read=retries,
                connect=retries,
                backoff_factor=backoff_factor,
                status=retries,
                status_forcelist=status_forcelist,
        )
        adapter = HTTPAdapter(max_retries=retry)
        session.mount('http://', adapter)
        session.mount('https://', adapter)
        return session

try:
        urlResp = requests.head("https://macmillan.dynamix.pro", timeout=(3, 3), verify=False)
        status = str(urlResp.status_code)
        print "Status is " + status
except Exception as e:
        print "bad " + str(e)

try:
        urlResp = requests_retry_session().head("https://macmillan.dynamix.pro", timeout=(3, 3), verify=False)
        status = str(urlResp.status_code)
        print "Status is " + status
except Exception as e:
        print "bad " + str(e)

有谁知道为什么会这样?

标签: pythonpython-requests

解决方案


推荐阅读