14

我们正在使用开发人员 Python 指南和 Python 数据 2.15 库,并按照应用引擎的示例说明。createSite("测试站点一", description="测试站点一", source_site =(" https://sites.google.com/feeds/site/googleappsforus.com/google-site-template " ))

每次使用时,我们都会得到不可预测的响应。

异常: HTTPException:等待来自 URL 的 HTTP 响应时超出了截止日期:https ://sites.google.com/feeds/site/googleappsforyou.com

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

问候,

4

2 回答 2

34

等待来自 URL 的 HTTP 响应时超出的最后期限实际上是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。请参阅App Engine Python 运行时请求计时器

于 2013-02-05T01:25:26.493 回答
9

httplib2在使用 和 的最新版本时,接受的解决方案对我不起作用googleapiclient。问题似乎是httplib2.Http它的 timeout 参数一直传递到urlfetch. 由于它的默认值为Noneurlfetch因此将该请求的限制设置为 5 秒,而与您设置的任何默认值无关urlfetch.set_default_fetch_deadline。看来您有几个选择。

第一个选项——你可以显式地传递一个 around 的实例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 不适用于未付费应用程序...

于 2015-11-19T23:03:07.700 回答