Значение тайм-аута в Python 3 урлопен? - PullRequest
1 голос
/ 27 февраля 2020

У меня небольшой сканер, и я извлекаю содержимое веб-страницы из простой страницы.

def url2dict(url):
    '''
    DOCSTRING: converts two-column data into a dictionary with first column as a key.
    INPUT: URL address as a string
    OUTPUT: dictionary with one key and one value

    '''
    with urlopen(url) as page:
        page_raw = page.read()
        ...

Теперь эта функция вызывает сервер по ссылке. Проблема в том, что сервер сгенерировал 504 Ошибка

File "C:\Python38\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python38\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "C:\Python38\lib\urllib\request.py", line 640, in http_response
    response = self.parent.error(
  File "C:\Python38\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)
  File "C:\Python38\lib\urllib\request.py", line 502, in _call_chain
    result = func(*args)
  File "C:\Python38\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 504: Gateway Time-out

Моя проблема в том, что я не могу найти значение по умолчанию для тайм-аута urlopen.

Здесь https://bugs.python.org/issue18417 it Говорят, что по умолчанию тайм-аут (timeout = None) отсутствует (по крайней мере для Python 3.4 версии):

ОК, я рассмотрел проблему достаточно, чтобы запомнить: если socket.setdefaulttimeout никогда не бывает вызывается, по умолчанию время ожидания равно None (нет времени ожидания).

Каково текущее состояние для 3.8?

Если время ожидания не установлено, почему я получил эту ошибку Error 504?

Подробнее:

Одна из ошибок показывает ошибку в

 File "C:\Python38\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)

Я открываю файл и прочитал:

def urlopen (url, data = None, timeout = socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile = None, capath = None, cadefault = False, context = None): '' 'Открыть URL-адрес URL, который может быть либо строкой, либо объект запроса.

*data* must be an object specifying additional data to be sent to
the server, or None if no such data is needed.  See Request for
details.

urllib.request module uses HTTP/1.1 and includes a "Connection:close"
header in its HTTP requests.

The optional *timeout* parameter specifies a timeout in seconds for
blocking operations like the connection attempt (if not specified, the
global default timeout setting will be used). This only works for HTTP,
HTTPS and FTP connections.

Так же, как и (если не указано, глобальная настройка времени ожидания по умолчанию) будет использоваться) означает, что если у меня определена глобальная переменная с именем timeout , она будет использоваться как длительность тайм-аута?

1 Ответ

0 голосов
/ 28 февраля 2020

Ваше исследование было действительно правильным, время ожидания по умолчанию определяется из socket._GLOBAL_DEFAULT_TIMEOUT. Чтобы узнать его значение, вы можете использовать socket.getdefaulttimeout():

Возвращать время ожидания по умолчанию в секундах (float) для новых объектов сокетов. Значение None указывает, что у новых объектов сокета нет времени ожидания. Когда модуль сокета импортируется впервые, по умолчанию используется None.

TL; по умолчанию для DR не задано время ожидания.

Время ожидания, которое вы видите, является ответом с сервера в соответствии с RF C:

Код состояния 504 (время ожидания шлюза) указывает на то, что сервер, выступая в качестве шлюза или прокси, не получил своевременный ответ от вышестоящего сервера, к которому он должен был получить доступ, чтобы завершить запрос.

Машина, против которой вы делаете запрос, - это фронт, который может быть, например, (обратным) прокси-сервером содержимое с другого сервера, например, для балансировки нагрузки между несколькими внутренними серверами.

Находясь на стороне сервера, вы не можете ничего с этим поделать, за исключением, возможно, уловки проблемы и если вы знаете / считаете, что это периодически -Постарайтесь.

...