2010-01-06 8 views
0

Je suis actuellement en train d'essayer de supprimer un cadre python hérité (webware 0.8.1) et couche cherrypy 3.1.2 sur le dessus de celui-ci. Au lieu de convertir toutes les pages webware en pages cherrypy, je suis simplement en train de le traiter via des logiciels web et de le passer à cherrypy comme ça.Cherrypy suspendu sur le poste

def default(self, url, *suburl, **kwarg):  
    ...snip... 
    strmout = DispatcherIO() 
    request = HTTPRequest(local_req) 
    transaction = self.create_transaction(request) 
    response = self.create_response(transaction, strmout) 
    transaction.setServlet(servlet) 
    transaction.awake() 
    transaction.respond() 
    return str(strmout) 

Cela fonctionne très bien pour toute page qui ne comprend pas un POST. Mais avec une page, y compris un poste comme le login, cherrypy pendrait à:

request = HTTPRequest(local_req) 

Ce qui appelle FieldStorage appeler le constructeur pour la cgi.FieldStorage parant. C'est là où il se bloque finalement. Toutefois, si je devais appuyer sur ctrl-c sur le terminal, il continuerait le traitement, puis se terminerait une fois la page chargée avec succès. Donc, avec la page de connexion, je voudrais cliquer sur "connexion", il se bloquerait, je vais ensuite appuyer sur ctrl-c sur le terminal, il me connectera, puis arrêter cherrypy.

J'ai trouvé que si j'utilisais cherrypy.engine.start au lieu de quickstart, cela ne déclencherait aucun gestionnaire de signal. Ce qui se passerait dans ce cas se traduirait par quelque chose de similaire au comportement précédent mais cherrypy continuerait à fonctionner.

Qu'est-ce qui pourrait causer ce problème? J'apprécierais vraiment toute aide. À votre santé.

Répondre

2

Je n'ai pas vraiment l'expérience avec Webware, mais d'après l'apparence de votre code, Webware tente d'utiliser cgi.FieldStorage pour récupérer vos variables sur le terrain, mais FieldStorage ne peut pas obtenir la longueur, ou obtient la longueur incorrectement (probablement parce que n'importe quel Webware pour obtenir l'en-tête Content-Length ne fonctionne pas dans votre environnement CherryPy WSGI - l'implémentation par défaut récupère la variable d'environnement HTTP_CONTENT_LENGTH, et Webware fait probablement quelque chose d'aussi hacky) , donc c'est en train de lire et puis ça se bloque. J'ai eu un problème similaire souvent lorsque je travaillais avec CGI.

La meilleure solution est de ne pas utiliser cgi.FieldStorage. Si l'objet HTTPRequest en question provient de Webware, ma recommandation est soit de porter votre site sur CherryPy complètement (ou un autre framework Web), soit d'utiliser simplement Webware dans son environnement natif. Hacking quelque chose pourrait être possible, mais WSGI est très différent de l'environnement natif de Webware de son propre serveur d'applications.

+0

Si cela ne tenait qu'à moi, je mettrais tout simplement à jour le webware à sa version actuelle qui est 1.02, mais malheureusement, ce n'est pas à moi de décider. Il n'est pas non plus possible de porter des logiciels web sur cherrypy car l'application est trop grande. Merci tout de même pour ta contribution! –