Question

Quelqu'un at-il eu une expérience avec l'exception suivante lors de l'utilisation GAE urlfetch?

      DownloadError: ApplicationError: 2 timed out

Je suis en train d'envoyer une requête HTTP POST. Comme ceci:

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

J'ai essayé de placer date limite au maximum (10 secondes). La demande de la ligne de commande (en utilisant friser ou httplib2) prend environ une seconde.

       nchong@almond ~ $ 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

Voici la sortie du dev serveur d'applications 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 -
Était-ce utile?

La solution

Le serveur Web de développement est mono-thread. Vous ne pouvez pas faire une demande de votre application en cours d'exécution à l'intérieur de lui-même. Essayez d'exécuter deux instances sur des ports différents.

Par ailleurs, cela ne devrait pas être un problème une fois qu'il est déployé, comme le serveur AppEngine réelle est bien sûr capable de gérer plusieurs requêtes simultanées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top