GAE - AppEngine - DeadlineExceededError: конечный срок превышен, ожидая ответа HTTP от URL: - программирование
Подтвердить что ты не робот

GAE - AppEngine - DeadlineExceededError: конечный срок превышен, ожидая ответа HTTP от URL:

У меня есть приложение Google AppEngine, которое отлично работает на моей локальной машине. Приложение отправляет изображение (с URL-адреса) на мою стену facebook. Однако, когда я развертываю его на серверах Google, я получаю ошибка:

DeadlineExceededError: Deadline exceeded while waiting for HTTP response from URL: 

Код нарушения:

facebook_access_token = facebook_info['access_token']

facebook_post_url = 'https://graph.facebook.com/me/photos?access_token=%s&url=%s&name=%s&method=post' % (facebook_access_token, url, caption)
facebook_post_url = facebook_post_url.replace(" ", "+");
facebook_result = urlfetch.fetch(facebook_post_url)

if facebook_result.status_code == 200:
  facebook_result_object = json.loads(facebook_result.content) 
  output_ids['facebook'] = facebook_result_object['id']
else:
  output_ids['facebook'] = ''

Полная трассировка ошибок:

Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 710, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/s~digibackapi/1.362663258877230387/main.py", line 512, in get
    facebook_result = urlfetch.fetch(facebook_post_url)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 266, in fetch
    return rpc.get_result()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 604, in get_result
    return self.__get_result_hook(self)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 404, in _get_fetch_result
    'Deadline exceeded while waiting for HTTP response from URL: ' + url)
DeadlineExceededError: Deadline exceeded while waiting for HTTP response from URL: https://graph.facebook.com/me/photos?access_token=<ACCESS_TOKEN>&url=http://digiback.cc/ej7&name=Trees&method=post

Опять же, код выглядит солидным для меня, и он работает нормально на моей локальной машине. Может ли это что-то делать с таймаутами? Когда я пытаюсь использовать facebook_post_url в браузере, он возвращается мгновенно.

Есть ли у кого-нибудь идеи? Я здесь полностью потерял.

Большое спасибо!

4b9b3361

Ответ 1

Попробуйте установить крайний срок для urlfetch до 30 секунд или более (в зависимости от того, вызываете ли вы urlfetch из обработчика задачи или обработчика запросов)

Дополнительная информация о urlfetch: Url Fetch Docs

Ответ 2

Простой ответ: конечный срок по умолчанию для настройки URL-адреса установлен на 5 секунд.

Как исправить:

from google.appengine.api import urlfetch

urlfetch.set_default_fetch_deadline(60)

Ответ 3

Я не знаком с API facebook. Но способ построения urlfetch выглядит немного странно. Нормальный метод (пост) является аргументом urlfetch, а почтовая полезная нагрузка urlencoded. Это приводит к:

params = urllib.urlencode([
    ('access_token', facebook_access_token),
    ('url', url),
    ('name', caption),
  ])
 response = urlfetch.fetch(url='https://graph.facebook.com/me/photos', payload=params, method=urlfetch.POST,
                      headers={'Content-Type': 'application/x-www-form-urlencoded'})

Ответ 4

Возможно, это связано с тем, что при тестировании локального кода URL-кода у меня был такой же срок. Оказывается, что в то время как прямой GET ресурса на dev-сервере через браузер будет работать, например, http://localhost:8080/content/test.jpg, попытка выполнить то же самое через urlfetch была обречена на провал каждый раз. Я могу только предположить, что выборка из localhost, которая переведена на 127.0.0.1 во время выполнения, не поддерживается urlfetch.

Оказывается, ваша проблема была действительно проблемой таймаута, тогда как мой ответ - не использовать urlfetch в dev.