2010-01-07 7 views
11

Est-ce que quelqu'un a eu une quelconque expérience avec l'exception suivante lors de l'utilisation de GAE urlfetch?GoogleAppEngine exception de délai d'expiration d'URL

 DownloadError: ApplicationError: 2 timed out 

J'essaie d'envoyer une requête HTTP POST. Comme si:

 result = urlfetch.fetch('http://api.nathan.com:8080/Obj/', 
           method='POST', 
           payload=postdata, 
           deadline=10) 

J'ai essayé de définir l'échéance au maximum (10 secondes). La requête de la ligne de commande (en utilisant curl ou httplib2) prend environ une seconde.

 [email protected] ~ $ time curl 
         -d "<Obj><a>1</a><b>n</b></Obj>" 
         http://api.nathan.com:8080/Obj/ 
     agd1c2VyYXBpcgoLEgRTZXNzGAIM  #< key returned by call 
     real 0m1.109s 
     user 0m0.003s 
     sys 0m0.009s 

est ici la sortie du serveur d'applications dev pour la demande boucle (j'utilise AppEngine-repos-serveur):

INFO  __init__.py:819] adding models from module __main__ 
INFO  __init__.py:867] added model Obj with type <class '__main__.Obj'> 
INFO  dev_appserver.py:3243] "POST /Obj HTTP/1.1" 200 - 
INFO  dev_appserver_index.py:205] Updating /path/to/index.yaml 

Voici la sortie lorsque je tente d'utiliser urlfetch:

ERROR __init__.py:388] ApplicationError: 2 timed out 
Traceback (most recent call last): 
    File "/path/to/webapp/__init__.py", line 507, in __call__ 
    handler.get(*groups) 
    File "/path/to/myapp/main.py", line 62, in get 
    result = urlfetch.fetch(...) 
    File "/path/to/urlfetch.py", line 241, in fetch 
    return rpc.get_result() 
    File "/path/to/apiproxy_stub_map.py", line 501, in get_result 
    return self.__get_result_hook(self) 
    File "/path/to/urlfetch.py", line 325, in _get_fetch_result 
    raise DownloadError(str(err)) 
DownloadError: ApplicationError: 2 timed out 
INFO  dev_appserver.py:3243] "GET/HTTP/1.1" 500 - 
INFO  dev_appserver.py:3243] "POST /Obj/ HTTP/1.1" 200 - 
+1

Ma solution de contournement actuelle consiste à envelopper l'appel urlfetch dans un bloc try/except. – nafe

+0

Êtes-vous capable de regarder ce qui se passe sur le serveur pendant cet appel? Est-ce qu'il traite correctement la charge utile et renvoie la clé? La valeur de postdata est-elle ce que vous pensez être? –

+0

Salut Alex, Le serveur reçoit la demande POST et crée un nouvel Obj basé sur l'appel. – nafe

Répondre

12

Le serveur Web de développement est mono-thread. Vous ne pouvez pas faire une demande de votre application s'exécutant à l'intérieur de lui-même. Essayez d'exécuter deux instances sur des ports différents. D'ailleurs, cela ne devrait pas être un problème une fois qu'il est déployé, car le serveur AppEngine est bien sûr capable de gérer plusieurs requêtes simultanées.

+0

Ah, cela semble être une piste de recherche très prometteuse. Je vais essayer et revenir à vous. Merci! – nafe

+2

Ce _really_ devrait être dans les docs. – bobobobo

+0

C'était exactement le problème. La division de l'expéditeur et du destinataire de l'urlfetch en serveurs distincts a résolu mon problème. – nafe

Questions connexes