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

Мы используем руководство по Python для разработчиков с библиотекой Python data 2.15 и в соответствии с примером, приведенным для движка приложения. createSite ("тестовый сайт один", описание ="тестовый сайт один", 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 или сайтов?

С Уважением,

2 ответа

Решение

Срок ожидания превышен при ожидании ответа 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.

Принятое решение не работает для меня при работе с самыми последними версиями httplib2 а также googleapiclient, Проблема в том, что httplib2.Http передает свой аргумент тайм-аута вплоть до 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 сокета не будет работать для неоплачиваемых приложений...

Другие вопросы по тегам