Impossible d'obtenir les valeurs POST avec cgi.FieldStorage
Je suis en train d'envoyer simple page html avec des données de formulaire à l'utilisateur à OBTENIR, et de recevoir ensuite des variables de la forme avec la POSTE.
HTML fichier ressemble à ceci:
<HTML>
<title> My Title</title>
<body>
<form method="post" action="http.py">
<input name="Name" type="text"/>
<input name="Submit" type="submit" value="Submit" />
</form>
</body>
</HTML>
Voici un script python:
import os
import cgi
import sys
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
class customHTTPServer(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
fh=open('index.html','r')
self.wfile.write(fh.read())
return
def do_POST(self):
form = cgi.FieldStorage()
self.send_response(200)
self.end_headers()
self.wfile.write(form['Name'].value)
def main():
try:
server = HTTPServer(('',9111),customHTTPServer)
print 'server started at port 8080'
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
if __name__=='__main__':
sys.exit(main())
Mais FieldStorage reste vide tout le temps. J'ai déjà essayé de vérifier ce qui est en soi.rfile, et a constaté que si j'essaie de le faire soi-même.rfile.readlines() , navigateur coincé et ressemble script est en attente de la fin du flux de données. D'où je devrais prendre le Nom de la variable que je suis à soumettre avec la POSTE?
Êtes-vous d'entrer une valeur dans votre champ de saisie avant d'envoyer le formulaire? Les champs vides ne sont pas prises en compte par
sûr que je l'ai fait. Peut
Ce n'est pas un script cgi. Voir ma réponse.
cgi.FieldStorage
, à moins que vous passiez keep_blank_values=True
à son constructeur.sûr que je l'ai fait. Peut
t figure out what i
m fait mal .Aussi l'auto.les en-têtes sont très bien, je peux voir Content-Type: application/x-www-form-urlencoded et d'autres trucs, mais de soi.rfile est un problème.Ce n'est pas un script cgi. Voir ma réponse.
OriginalL'auteur Daniel Gurianov | 2012-07-04
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pourriez être un mélange de certains concepts ici. Vous avez à la fois l'idée d'un serveur et d'un script cgi. Quel que soit votre action POST est (http.py ou quoi que ce soit), votre serveur est simplement l'intention de faire une demande. Pas de CGI de traitement qui se passe réellement. De sorte que vous pouvez ajuster votre modèle html pour la simplicité:
Ensuite, vous devez faire référence à cet autre question au sujet de comment lire de la demande, plutôt que d'essayer d'utiliser le cgi fieldstorage:
La question que vous aviez, et parce que c'est un très faible niveau moyen de créer un serveur web app, si vous lisez indéfiniment à partir du flux d'entrée, il va continuer et le bloc. Vous cochez la case d'en-tête pour la longueur du contenu et de ne lire que le nombre d'octets. Vous n'avez pas besoin pour le module cgi à tous, parce que ce n'est pas un script cgi.
Un script cgi fonctionne par le serveur de voir la demande est pour un fichier de même type et de l'emplacement, et de l'exécuter dans un sous-processus comme un programme normal. Il se nourrit le processus de la args puis obtient en retour une réponse à renvoyer au client. Il s'agit d'un script cgi, le serveur sera dans un module, courir éternellement, et le code cgi serait dans un autre avec un code bien plus simple de vérifier la demande.
Vous dites "Vous n'avez pas besoin pour le module cgi à tous, parce que ce n'est pas un script cgi", et pourtant, l'autre question que vous avez de référence (pour "comment lire de la demande") n'est, en effet, utiliser le module cgi (en particulier: cgi.parse_header, cgi.parse_multipart, et cgi.parse_qs), et il n'est pas un script CGI. Clairement, le module cgi est utile que pour des CGI de traitement. En outre, le code source de cgi.parse_multipart suggère qu'il devrait être subsumé par le cgi.FieldStorage, de sorte qu'il semble comme une approche impliquant cgi.FieldStorage devrait être réalisable, même concis.
Cette réponse n'est pas correcte pour la question posée. cgi.FieldStorage gère correctement les deux
application/x-www-form-urlencoded
etmultipart/form-data
(téléchargement de fichiers) les types de contenu. Dans l'exemple donné, bien qu'utile, pour éviter le blocage sur lerfile
descripteur de fichier, de ne pas analyser correctementmultipart/form-data
. Voir Michael Dyck est une suggestion pour une réponse correcte à cette question.OriginalL'auteur jdi
Dans le code d'origine, j'ai juste changé la ligne
à
et il semble fonctionner comme prévu.
Hat tip pour http://pymotw.com/2/BaseHTTPServer/ pour la critique 'environ. (Par défaut, cgi.FieldStorage pense que c'est de traiter avec une requête GET.)
environ={'REQUEST_METHOD':'POST'}
a fait le tour pour moi.OriginalL'auteur Michael Dyck
Voici l'URL pour l'approche pour obtenir POST vars, dans mon cas Ici
Explication détaillée est fournie par JDI.
OriginalL'auteur Daniel Gurianov