5

我知道它urllib2在 Google App Engine 上可用作 Urlfetch 的包装器,并且如您所知,Universal Feedparser 使用 urllib2。

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

我对以下方法不感兴趣:

rssurldata = urlfetch(rssurl, deadline=..)
feedparser.parse(rssurldata)
4

4 回答 4

3

没有简单的方法可以做到这一点,因为据我所知,包装器没有提供传递超时值的方法。一种骇人听闻的选择是对 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
于 2010-07-27T12:54:38.170 回答
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
    )
于 2012-05-26T09:30:28.670 回答
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

于 2015-03-23T11:08:42.610 回答
-3

您是否尝试过设置套接字超时值?取自这里

从 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具有传递超时参数的能力:

可选的 timeout 参数以秒为单位指定连接尝试等阻塞操作的超时时间(如果未指定,将使用全局默认超时设置)。这实际上只适用于 HTTP、HTTPS、FTP 和 FTPS 连接。连接。

于 2010-07-26T20:50:03.183 回答