HTTPException:等待来自URL的HTTP响应时超出截止时间:#deadline

时间:2013-02-05 00:17:24

标签: google-app-engine google-api-python-client deadlines

我们正在使用Python数据2.15库的开发人员python指南,并根据app引擎的示例。 createSite(“test site one”,description =“test site one”,source_site =(“https://sites.google.com/feeds/site/googleappsforus.com/google-site-template”))

每次使用时,我们都会收到无法预测的响应。

例外: HTTPException:等待来自网址的HTTP响应时超出截止日期:https://sites.google.com/feeds/site/googleappsforyou.com

有人遇到同样的问题吗? AppEngine或Sites API是否相关?

此致

2 个答案:

答案 0 :(得分:33)

等待来自URL 的HTTP响应时超过截止日期实际上是 DeadlineExceededError 。当您发出HTTP请求时,App Engine会将此请求映射到URLFetch。 URLFetch有自己的可配置截止日期。请参阅URLFetch documentation

您的客户端库似乎捕获DeadlineExceededError并抛出HTTPException。您的客户端库要么将截止日期传递给URLFetch(您需要更改),要么默认截止日期不足以满足您的请求。

尝试设置默认的URLFetch截止日期:

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

另请务必查看官方文档中的Dealing with DeadlineExceededErrors

请记住,任何最终用户发起的请求必须在60秒内完成,否则将遇到DeadlineExceededError。请参阅App Engine Python Runtime Request Timer

答案 1 :(得分:7)

在使用最新版本的httplib2googleapiclient时,已接受的解决方案对我不起作用。问题似乎是httplib2.Http将其超时参数一直传递给urlfetch。由于默认值为Noneurlfetch会将该请求的限制设置为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 。为此,您https://support.microsoft.com/en-us/kb/3071338

env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

1 可能仅适用于付费应用,因为套接字api可能不适用于非付费应用...
2 我几乎可以肯定,这只适用于付费应用,因为套接字api不能用于非付费应用......