2017-04-17 4 views
2

Actuellement, je courais un serveur errante sur Ubuntu 14.04 et je tester tous mes modules django en utilisant simple python manage.py runserver 0.0.0.0:8000erreur mystérieuse lorsque vous utilisez le serveur django avec grequests

Depuis que je me connecte au serveur web django en utilisant le chrome par http://localhost:8000 et le serveur est en cours d'exécution sur une machine virtuelle, je suis redirection de port grâce à l'utilisation du paramètre suivant dans Vagrantfile

config.vm.network "forwarded_port", guest: 8000, host: 8000

tout fonctionne normalement (tous les modules/vues/tests fonction comme prévu), mais, depuis que je commencé à utiliser grequests je reçois cette erreur bizarre

Exception happened during processing of request from ('10.0.2.2', 63520) 
Traceback (most recent call last): 
    File "/home/vagrant/anaconda3/lib/python3.6/socketserver.py", line 639, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/home/vagrant/anaconda3/lib/python3.6/socketserver.py", line 361, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/home/vagrant/anaconda3/lib/python3.6/socketserver.py", line 696, in __init__ 
    self.handle() 
    File "/home/vagrant/anaconda3/lib/python3.6/site-packages/django/core/servers/basehttp.py", line 159, in handle 
    self.raw_requestline = self.rfile.readline(65537) 
    File "/home/vagrant/anaconda3/lib/python3.6/socket.py", line 586, in readinto 
    return self._sock.recv_into(b) 
    File "/home/vagrant/anaconda3/lib/python3.6/site-packages/gevent/_socket3.py", line 385, in recv_into 
    self._wait(self._read_event) 
    File "/home/vagrant/anaconda3/lib/python3.6/site-packages/gevent/_socket3.py", line 157, in _wait 
    self.hub.wait(watcher) 
    File "/home/vagrant/anaconda3/lib/python3.6/site-packages/gevent/hub.py", line 651, in wait 
    result = waiter.get() 
    File "/home/vagrant/anaconda3/lib/python3.6/site-packages/gevent/hub.py", line 899, in get 
    return self.hub.switch() 
    File "/home/vagrant/anaconda3/lib/python3.6/site-packages/gevent/hub.py", line 630, in switch 
    return RawGreenlet.switch(self) 
gevent.hub.LoopExit: ('This operation would block forever', <Hub at 0x7f3b777e8af8 epoll pending=0 ref=0 fileno=34>) 

Notez que je n'utilise pas grequests et que l'importation simplement il semble provoquer cette erreur, même quand il est pas appelé ou n'importe quoi

Quelqu'un a des idées?

Répondre

3

C'est un problème avec l'un de la dépendance sous-jacente - gevent, qui remplace le comportement par défaut de python builtin tels que time, etc.

Vous auriez à monkey-patch. Quelque chose comme:

from gevent import monkey 
monkey.patch_all() 

Voici le gevent documentation pertinent.

J'ai récemment couru sur cette question exacte - donc cessé d'utiliser grequests et mis en œuvre ma propre logique de demandes async

+0

Bonjour, merci pour la réponse. Étant donné que grequests est utilisé dans plusieurs modules, devrais-je appeler 'monkey.patch_all()' sous chaque grequests import? De même, lancer votre propre logique de requêtes asynchrones semble un peu dur. Y at-il un défaut majeur que je ne connais pas? – AlanSTACK

+0

Un autre suivi, pourriez-vous me diriger vers une alternative aux grequests? Je l'utilise actuellement pour gérer plusieurs appels d'API de repos en même temps (par exemple envoyer des requêtes PATCH à certaines API qui ne supportent que l'édition d'une chose à la fois) – AlanSTACK

+0

Je ne connais pas une bonne alternative pour le moment. Vous devriez construire votre propre – karthikr