2010-07-26 61 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

相關問題