2010-07-26 23 views
5

Jestem świadomy, że urllib2 jest dostępny w Google App Engine jako opakowanie Urlfetch i, jak wiadomo, Universal Feedparser używa urllib2.Jak zadeklarować limit czasu za pomocą urllib2 w Google App Engine?

Czy znasz dowolną metodę ustawiania limitu czasu na urllib2?
Czy parametr timeout na urllib2 został przeniesiony w wersji Google App Engine?

Nie jestem zainteresowany metody jak:

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

Czy istnieje konkretny powód, dla którego nie chcesz używać prostszej metody, którą właśnie opisałeś? –

+0

@Nick Hi :)! Uhm, po prostu dlatego, że biblioteka indeksowania kanałów, z którą pracuję jest w pewien sposób zamknięta i powinna pozostać niezobowiązująca. Czy możesz wskazać mi na opakowaniu urllib2 na kodzie źródłowym gae? Nie wiem również, czy bieżący limit czasu urllib2 jest ustawiony na 5 sekund lub maksymalnie na 10 sekund (MAX Urlfetch Deadline). – systempuntoout

+0

Opakowanie pozostawia czas oczekiwania domyślnie na 5 sekund.Nie jestem świadomy żadnego sposobu przekazania wartości limitu czasu przez opakowanie do interfejsu API urlfetch. Jednak na hackish końcu rzeczy, zawsze można monkeypatch API urlfetch domyślnie do 10 sekund ... –

Odpowiedz

3

Nie ma prostego sposobu, aby to zrobić, ponieważ opakowanie nie zapewnia sposobu przejścia przez wartość limitu czasu, zgodnie z moją najlepszą wiedzą. Jedną z hackerskich opcji jest monkeypatch API urlfetch:

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

gdzie jest odpowiednie miejsce do łatania tego? Główne lub bezpośrednio przed wywołaniem biblioteki pełzającej? – systempuntoout

+0

Najwyższy poziom w każdym module, który zostanie zaimportowany przed użyciem interfejsu API. –

+0

pracował jak wdzięk, dzięki. – systempuntoout

-3

Czy próbowałeś ustawienie wartości limitu czasu gniazdo? Zaczerpnięte z here:

Od Pythona 2.3 można określić, jak długo gniazdo ma czekać na odpowiedź przed przekroczeniem limitu czasu. Może to być przydatne w aplikacjach, które muszą pobierać strony internetowe. Domyślnie moduł gniazda nie ma limitu czasu i może się zawiesić. Obecnie limit czasu gniazda nie jest wyświetlany na poziomie httplib lub urllib2. Można jednak ustawić domyślny czas globalnie dla wszystkich gniazd przy użyciu:

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) 

Nie jestem pewien, czy GAE odczytuje tę wartość, ale warto spróbować!

Edit:

urllib2 ma możliwość przekazać parametr timeout:

Opcjonalny Timeout parametr określa limit czasu w sekundach dla operacji blokujących jak próba połączenie (jeśli nie podano, zostanie użyte globalne domyślne ustawienie limitu czasu ). To faktycznie tylko działa dla HTTP, HTTPS, FTP i FTPS connections.connections.

+0

tak, to była moja pierwsza próba. Socket nie ma setdefaulttimeout metody na gae :). Dzięki za poświęcony czas. – systempuntoout

+0

Co z parametrem timeout urllib2? – advait

+0

Pytam "Czy parametr timeout na urllib2 został przeniesiony w wersji Google App Engine?". – systempuntoout

1

Wolę to. Jest bardziej dynamiczny w przypadku aktualizacji interfejsu API GAE.

# -*- 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

Można ustawić termin domyślnego, który jest preferowany sposób:

from google.appengine.api import urlfetch 
import urllib, urllib2 


class MyClass(): 

    def __init__(self): 
     urlfetch.set_default_fetch_deadline(10) 

mam otwieracz I Używanie urllib2 celu umożliwienia CookieJar, ale można to po prostu zrobić proste prośby

response = self.opener.open(self.url_login, data_encoded) 

można łatwo zobaczyć efekt jeśli wyznaczyła termin do 0.1