2010-07-26 47 views
5

我知道urllib2在Google App Engine上可用作Urlfetch的包装,正如您所知,Universal Feedparser使用urllib2。如何在Google App Engine上使用urllib2声明超时值?

你知道任何在urllib2上设置超时的方法吗?
urllib2上的timeout参数是否已在Google App Engine版本上移植?

我没有兴趣在这样的方法:

rssurldata = urlfetch(rssurl, deadline=..) 
feedparser.parse(rssurldata) 
+0

有你不想使用刚刚概述的更简单的方法的具体原因是什么? – 2010-07-27 08:47:14

+0

@尼克嗨:)!嗯,只是因为我正在处理的饲料爬行库有点密封,应该保持gae不可知论。你能把我指向gae源代码上的urllib2包装吗?我也不知道当前的urllib2超时设置为5秒还是最大为10秒(MAX Urlfetch截止时间) – systempuntoout 2010-07-27 09:46:35

+0

包装器将超时设置为默认值5秒。我不知道有什么方法通过包装器将超时值传递给urlfetch API。然而,在事情的恶意结尾,你总是可以将urlfetch API默认为10秒... – 2010-07-27 10:12:02

回答

3

有没有简单的方法来做到这一点,因为包装没有提供一种方式来通过超时值,据我所知。一个hackish的选择将是monkeatch的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 
+0

哪里是修补此问题的正确位置?在调用爬行库之前的主要部分或直接部分? – systempuntoout 2010-07-27 13:15:39

+0

在使用API​​之前导入的任何模块的顶层。 – 2010-07-27 14:18:31

+0

像一个魅力工作,谢谢。 – systempuntoout 2010-07-28 14:47:22

-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。

+0

是的,这是我的第一次尝试。 Socket没有在gae上使用setdefaulttimeout方法:)谢谢你的时间。 – systempuntoout 2010-07-26 20:51:59

+0

urllib2的timeout参数呢? – advait 2010-07-26 20:59:55

+0

我在问:“urllib2上的超时参数是否已在Google App Engine版本上移植?”。 – systempuntoout 2010-07-27 06:34:19

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 
    ) 
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

相关问题