HTTPException: срок ожидания превышен, ожидая ответа HTTP от URL: #deadline

Мы используем руководство python для разработчиков с библиотекой данных Python 2.15 и, как указано в примере для приложения. createSite ( "test site one", description = "test site one", source_site = ( "https://sites.google.com/feeds/site/googleappsforus.com/google-site-template" ))

Мы получаем непредсказуемый ответ каждый раз, когда мы используем.

Исключение: HTTPException: срок ожидания превышен, ожидая ответа HTTP от URL: https://sites.google.com/feeds/site/googleappsforyou.com

У кого-то возникли те же проблемы? Связан ли это API AppEngine или сайтов?

Привет,

Ответ 1

Крайний срок, ожидающий ответа HTTP от URL, на самом деле является DeadlineExceededError. Когда вы делаете HTTP-запрос, App Engine сопоставляет этот запрос с URLFetch. URLFetch имеет свой собственный срок, который можно настроить. См. Документацию URLFetch.

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

Попробуйте установить крайний срок по умолчанию URLFetch следующим образом:

from google.appengine.api import urlfetch
urlfetch.set_default_fetch_deadline(45)

Также не забудьте проверить Работа с DeadlineExceededErrors в официальных документах.

Имейте в виду, что любой запрос, инициированный конечным пользователем, должен завершиться через 60 секунд или встретится с DeadlineExceededError. См. Таймер запроса времени выполнения Python App Engine.

Ответ 2

Принятое решение не работало для меня при работе с последними версиями httplib2 и googleapiclient. Проблема заключается в том, что httplib2.Http передает аргумент timeout до urlfetch. Поскольку он имеет значение по умолчанию None, urlfetch устанавливает предел для этого запроса на 5 секунд, независимо от того, какой вы по умолчанию устанавливаете с помощью urlfetch.set_default_fetch_deadline. Кажется, у вас есть несколько вариантов.

Первый вариант. Вы можете явно передать экземпляр httplib2.Http вокруг:

http = httplib2.Http(timeout=30)
...
client.method().execute(http=http)

Второй вариант, вы можете установить значение по умолчанию с помощью сокетов 1:

import socket
socket.setdefaulttimeout(30)

Третий вариант, вы можете сказать appengine, чтобы использовать сокеты для запросов 2. Для этого вы измените app.yaml:

env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

1 Это может работать только для платных приложений, поскольку сокет api может отсутствовать для неоплаченных приложений...
2 Я почти уверен, что это будет работать только для платных приложений, так как сокет api не будет функционировать для неоплаченных приложений...