我有一个Google AppEngine应用程序,它在我的本地计算机上运行良好。该应用程序将图像(从网址)发布到我的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'] = ''
Ans完整的错误跟踪是:
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
时,它会立即返回。
有没有人有任何想法?我在这里完全失败了。
非常感谢!
答案 0 :(得分:28)
简单回答:网址提取的默认截止日期设置为5秒。
如何解决:
from google.appengine.api import urlfetch
urlfetch.set_default_fetch_deadline(60)
答案 1 :(得分:8)
尝试将urlfetch的截止日期设置为30秒或更长时间(取决于您是否在任务处理程序或请求处理程序中调用urlfetch)
有关urlfetch的更多信息:Url Fetch Docs
答案 2 :(得分:0)
我不熟悉facebook API。但是urlfetch的构造方式看起来有点奇怪。 Normaly方法(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'})
答案 3 :(得分:0)
可能相关:我在测试本地urlfetch代码时遇到了相同的截止日期。事实证明,虽然通过浏览器直接对开发服务器上的资源进行GET工作,例如http://localhost:8080/content/test.jpg
,但尝试相同的通过urlfetch
注定每次都失败。我只能假设urlfetch
不支持从运行时转换为127.0.0.1的localhost获取。
事实证明你的确是一个超时问题,而我的回答是不在开发中使用urlfetch。
答案 4 :(得分:0)
全局设置截止日期的另一种方法是将其设置在特定的提取调用上。在你的情况下:
result = urlfetch.fetch(
url=your_url,
deadline=60
)