18

我有一个在我的本地机器上运行良好的 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在浏览器中尝试时,它会立即返回。

有没有人有任何想法?我在这里完全不知所措。

非常感谢!

4

5 回答 5

29

简单的回答:url 获取的默认期限设置为 5 秒。

怎么修:

from google.appengine.api import urlfetch

urlfetch.set_default_fetch_deadline(60)
于 2014-02-28T09:32:54.980 回答
9

尝试将 urlfetch 的最后期限设置为 30 秒或更长时间(取决于您是从任务处理程序还是请求处理程序中调用 urlfetch)

有关 urlfetch 的更多信息:Url Fetch Docs

于 2012-10-24T16:09:03.003 回答
1

全局设置截止日期的另一种方法是在特定的 fetch 调用上设置它。在你的情况下:

result = urlfetch.fetch(
    url=your_url,
    deadline=60
)
于 2018-03-12T22:39:27.520 回答
0

我不熟悉 facebook API。但是 urlfetch 的构造方式看起来有点奇怪。通常,方法(Post)是一个 urlfetch 参数,并且 post 有效负载是 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'})
于 2012-10-24T16:37:18.073 回答
0

可能相关:我在测试本地 urlfetch 代码时遇到了相同的截止日期。事实证明,虽然通过浏览器直接 GET 开发服务器上的资源是可行的,例如,http://localhost:8080/content/test.jpg尝试相同的 viaurlfetch每次都注定要失败。我只能假设urlfetch.

事实证明,你的问题确实是一个超时问题,而我的答案是不要在 dev.xml 中使用 urlfetch。

于 2013-02-21T01:18:14.483 回答