2015-09-22 1 views
0

Voici donc l'affaire: J'écris une application IRC simple et légère, hébergée localement, qui fait essentiellement le même travail que Xchat et fonctionne dans votre navigateur, tout comme Sabnzbd. J'affiche les résultats de la recherche dans le navigateur sous la forme d'une table html, et en utilisant une requête AJAX GET avec un événement on_click, le téléchargement est lancé. J'utilise une autre requête AJAX GET dans une boucle d'une seconde pour demander les informations de téléchargement (état, progression, vitesse, ETA, etc.). Je rencontre un problème avec les requêtes AJAX simultanées, car mon gestionnaire CGI semble ne pouvoir traiter qu'un seul thread à la fois: en effet, le thread principal traite le téléchargement, tandis que les demandes de statut de téléchargement sont également envoyées. Comme j'avais une application Django quelque part, j'ai essayé d'implémenter cette application IRC et tout fonctionne correctement. Les demandes simultanées sont gérées correctement. Y a-t-il quelque chose que je dois savoir avec le gestionnaire HTTP? Est-il impossible avec le handle CGI de base de traiter des requêtes simultanées? J'utilise ce qui suit pour mon CGI application IRC:Python CGI demandes simultanées AJAX

from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler 

Si ce n'est pas sur la théorie mais de mon code, je peux volontiers après divers scripts python si elle aide.

Répondre

0

Ainsi, après d'autres recherches, voici mon code, whick fonctionne:

from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler 
from socketserver import ThreadingMixIn 
import threading 
import cgitb; cgitb.enable() ## This line enables CGI error reporting 
import webbrowser 


class HTTPRequestHandler(CGIHTTPRequestHandler): 
    """Handle requests in a separate thread.""" 
    def do_GET(self): 
     if "shutdown" in self.path: 
      self.send_head() 
      print ("shutdown") 
      server.stop() 
     else: 
      self.send_head() 


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): 
    allow_reuse_address = True 
    daemon_threads = True 

    def shutdown(self): 
     self.socket.close() 
     HTTPServer.shutdown(self) 

class SimpleHttpServer(): 
    def __init__(self, ip, port): 
     self.server = ThreadedHTTPServer((ip,port), HTTPRequestHandler) 
     self.status = 1 

    def start(self): 
     self.server_thread = threading.Thread(target=self.server.serve_forever) 
     self.server_thread.daemon = True 
     self.server_thread.start() 

    def waitForThread(self): 
     self.server_thread.join() 

    def stop(self): 
     self.server.shutdown() 
     self.waitForThread() 

if __name__=='__main__': 
    HTTPRequestHandler.cgi_directories = ["/", "/ircapp"] 
    server = SimpleHttpServer('localhost', 8020) 
    print ('HTTP Server Running...........') 
    webbrowser.open_new_tab('http://localhost:8020/ircapp/search.py') 
    server.start() 
    server.waitForThread() 
0

Un peu plus profondément dans the documentation:

Ces quatre processus classes demande synchrone; chaque requête doit être terminée avant que la demande suivante puisse être démarrée.

TL; DR: utilise un serveur Web réel.

+0

Il est donc ce que je suppose? Cela fonctionne sur mon application Django, car elle est basée sur WSGI? – mrj

+1

Cela fonctionne sur votre application Django car elle est exécutée via un serveur Web qui peut gérer plusieurs requêtes simultanées. –