Ответ 1
Попробуйте установить крайний срок для urlfetch до 30 секунд или более (в зависимости от того, вызываете ли вы urlfetch из обработчика задачи или обработчика запросов)
Дополнительная информация о urlfetch: Url Fetch Docs
У меня есть приложение 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
в браузере, он возвращается мгновенно.
Есть ли у кого-нибудь идеи? Я здесь полностью потерял.
Большое спасибо!
Попробуйте установить крайний срок для urlfetch до 30 секунд или более (в зависимости от того, вызываете ли вы urlfetch из обработчика задачи или обработчика запросов)
Дополнительная информация о urlfetch: Url Fetch Docs
Простой ответ: конечный срок по умолчанию для настройки URL-адреса установлен на 5 секунд.
Как исправить:
from google.appengine.api import urlfetch
urlfetch.set_default_fetch_deadline(60)
Я не знаком с 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'})
Возможно, это связано с тем, что при тестировании локального кода URL-кода у меня был такой же срок. Оказывается, что в то время как прямой GET ресурса на dev-сервере через браузер будет работать, например, http://localhost:8080/content/test.jpg
, попытка выполнить то же самое через urlfetch
была обречена на провал каждый раз. Я могу только предположить, что выборка из localhost, которая переведена на 127.0.0.1 во время выполнения, не поддерживается urlfetch
.
Оказывается, ваша проблема была действительно проблемой таймаута, тогда как мой ответ - не использовать urlfetch в dev.