我知道Google App Engine上有urllib2
作为Urlfetch的包装,如您所知,Universal Feedparser使用urllib2。
你知道在urllib2上设置超时的方法吗?
urllib2上的timeout
参数是否已移植到Google App Engine版本上?
我对以下方法不感兴趣:
rssurldata = urlfetch(rssurl, deadline=..)
feedparser.parse(rssurldata)
答案 0 :(得分:3)
没有简单的方法可以做到这一点,因为根据我的知识,包装器不提供传递超时值的方法。一个hackish选项是monkeypatch urlfetch API:
old_fetch = urlfetch.fetch
def new_fetch(url, payload=None, method=GET, headers={},
allow_truncated=False, follow_redirects=True,
deadline=10.0, *args, **kwargs):
return old_fetch(url, payload, method, headers, allow_truncated,
follow_redirects, deadline, *args, **kwargs)
urlfetch.fetch = new_fetch
答案 1 :(得分:1)
我更喜欢这个。它对GAE API更新更具动态性。
# -*- coding: utf-8 -*-
from google.appengine.api import urlfetch
import settings
def fetch(*args, **kwargs):
"""
Base fetch func with default deadline settings
"""
fetch_kwargs = {
'deadline': settings.URL_FETCH_DEADLINE
}
fetch_kwargs.update(kwargs)
return urlfetch.fetch(
*args, **fetch_kwargs
)
答案 2 :(得分:0)
您可以设置默认的截止日期,这是首选方式:
from google.appengine.api import urlfetch
import urllib, urllib2
class MyClass():
def __init__(self):
urlfetch.set_default_fetch_deadline(10)
我有一个开启者,我使用urllib2来启用CookieJar,但你可以只做简单的请求
response = self.opener.open(self.url_login, data_encoded)
如果您将截止日期设置为0.1
答案 3 :(得分:-3)
您是否尝试过设置套接字超时值?取自here:
从Python 2.3开始,您可以指定套接字在超时之前应等待响应的时间。这在必须获取网页的应用程序中非常有用。默认情况下,套接字模块没有超时并且可以挂起。目前,套接字超时未在httplib或urllib2级别公开。但是,您可以使用以下命令为所有套接字全局设置默认超时:
import socket
import urllib2
# timeout in seconds
timeout = 10
socket.setdefaulttimeout(timeout)
# this call to urllib2.urlopen now uses the default timeout
# we have set in the socket module
req = urllib2.Request('http://www.voidspace.org.uk')
response = urllib2.urlopen(req)
我不确定GAE是否读取此值,但值得一试!
编辑:
urllib2
能够传递超时参数:
可选的超时参数 指定以秒为单位的超时 像这样的阻止操作 连接尝试(如果未指定, 全局默认超时设置 将会被使用)。这实际上只是 适用于HTTP,HTTPS,FTP和FTPS connections.connections。