2010-07-26 14 views
5

Je sais que urllib2 est disponible sur Google App Engine en tant que wrapper d'Urlfetch et, comme vous le savez, Universal Feedparser utilise urllib2.Comment déclarer un timeout en utilisant urllib2 sur Google App Engine?

Connaissez-vous une méthode pour définir un délai d'expiration sur urllib2?
Le paramètre timeout sur urllib2 a-t-il été porté sur la version de Google App Engine?

Je ne suis pas intéressé par la méthode comme:

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

est-il une raison particulière pour laquelle vous ne voulez pas utiliser la méthode plus simple que vous venez de décrire? –

+0

@Nick Salut :)! Uhm, tout simplement parce que la bibliothèque d'exploration de flux que je travaille avec est un peu scellé et devrait rester agnostique gae. Pourriez-vous me diriger vers le wrapper urllib2 sur le code source gae? Je ne sais pas non plus si le délai d'expiration actuel de l'urllib2 est de 5 secondes ou maximum de 10 secondes (MAX Urlfetch Deadline) – systempuntoout

+0

L'enveloppe laisse le délai par défaut de 5 secondes.Je ne suis pas au courant d'un moyen de passer une valeur de délai via le wrapper à l'API urlfetch. Sur la fin des choses hackish, cependant, vous pouvez toujours monkeypatch l'API urlfetch à défaut de 10 secondes ... –

Répondre

3

Il n'y a pas de façon simple de faire cela, car le wrapper ne fournit pas un moyen de passer à travers la valeur du délai, à ma connaissance. Une option hackish serait de monkeypatch l'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

où est le bon endroit pour patcher ça? Sur principale ou droite avant l'appel à la bibliothèque rampante? – systempuntoout

+0

Niveau supérieur dans tout module importé avant l'utilisation de l'API. –

+0

a travaillé comme un charme, merci. – systempuntoout

-3

Avez-vous essayé de définir la valeur de délai d'attente de prise? Tiré de here:

A partir de Python 2.3, vous pouvez spécifier la durée pendant laquelle un socket doit attendre une réponse avant d'expirer. Cela peut être utile dans les applications qui doivent aller chercher des pages Web. Par défaut, le module de socket n'a pas de délai et peut se bloquer. Actuellement, le délai d'attente de socket n'est pas exposé aux niveaux httplib ou urllib2. Cependant, vous pouvez définir le délai d'attente par défaut globalement pour toutes les prises en utilisant:

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) 

Je ne sais pas si GAE lit cette valeur, mais il vaut le coup!

Edit:

urllib2 a la capacité de passer un paramètre de délai d'attente:

Le paramètre délai d'attente en option spécifie un délai d'attente en secondes pour opérations de blocage comme la tentative de connexion (si non spécifié, le paramètre de temporisation par défaut global sera utilisé). En fait, cela fonctionne uniquement pour les connexions HTTP, HTTPS, FTP et FTPS connections.connections.

+0

oui, c'était mon premier essai. Socket n'a pas la méthode setdefaulttimeout sur gae :). Merci pour votre temps cependant. – systempuntoout

+0

Qu'en est-il du paramètre de délai d'urllib2? – advait

+0

Je demande "Est-ce que le paramètre" timeout "sur urllib2 a été porté sur la version de Google App Engine?". – systempuntoout

1

Je préfère cela. C'est plus dynamique pour les mises à jour de l'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

Vous pouvez régler le délai par défaut qui est la voie préférée:

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


class MyClass(): 

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

J'ai un ouvreur j'utilise du urllib2 pour permettre à l'CookieJar, mais vous pouvez le faire des demandes simples

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

vous pouvez facilement voir l'effet si vous définissez la date limite pour 0.1