Parse http GET und POST Parameter von BaseHTTPHandler?

BaseHTTPHandler aus dem BaseHTTPServer-Modul scheint keine praktische Möglichkeit zu finden, auf http-Anforderungsparameter zuzugreifen. Was ist der beste Weg, um die GET-Parameter aus dem Pfad zu analysieren und die POST-Parameter aus dem Request-Body?

Im Moment nutze ich das für GET:

  • Wie kann ich Bild-Content-Typen mit Python BaseHTTPServerRequestHandler do_GET-Methode?
  • Stack mit Python HTTP Server mit Basic Authentication mit BaseHTTP
  • Parsing von Python-HTML-POST-Daten aus BaseHTTPServer
  • Daemonisierung von Pythons BaseHTTPServer
  • Wie kann ich BaseHTTPServer.serve_forever () in einer BaseHTTPRequestHandler-Unterklasse stoppen?
  • Python basehttpserver: Kann ich die 404 Antwort ändern?
  • def do_GET(self): parsed_path = urlparse.urlparse(self.path) try: params = dict([p.split('=') for p in parsed_path[4].split('&')]) except: params = {} 

    Das funktioniert für die meisten Fälle, aber ich möchte etwas Robusteres, das Kodierungen und Koffer wie leere Parameter richtig behandelt. Im Idealfall möchte ich etwas Klein und Standalone, anstatt ein volles Web-Framework.

  • BFS für arithmetische Operationen
  • Punkt in zufälliger Form Polygon?
  • Wie kann man das "Mastermind" Ratenspiel lösen?
  • Finden Sie das kth-kleinste Element in der Vereinigung von sortierten Arrays
  • Verbesserung der Zusammenführung sortieren
  • Welcher Python-Code erzeugt alle möglichen Gruppierungen (Bäume) für Binäroperatoren
  • 5 Solutions collect form web for “Parse http GET und POST Parameter von BaseHTTPHandler?”

    Du könntest die Werkzeug- Module ausprobieren, die Basis-Werkzeugbibliothek ist nicht zu groß und bei Bedarf kannst du einfach diesen Codecode extrahieren und du bist fertig.

    Die url_decode Methode gibt ein MultiDict zurück und hat eine Codierungsunterstützung 🙂

    Im Gegensatz zur Methode urlparse.parse_qs kümmert sich die Werkzeug-Version um:

    • Codierung
    • Mehrere Werte
    • Sortierreihenfolge

    Wenn Sie keine Notwendigkeit für diese (oder im Falle der Kodierung, verwenden Sie Python 3) als fühlen sich frei, die integrierten Lösungen verwenden.

    Sie können urlparse.parse_qs verwenden :

     >>> from urlparse import urlparse, parse_qs >>> url = 'http://example.com/?foo=bar&one=1' >>> parse_qs(urlparse(url).query) {'foo': ['bar'], 'one': ['1']} 

    Bessere Lösung für eine alte Frage:

     def do_POST(self): length = int(self.headers.getheader('content-length')) field_data = self.rfile.read(length) fields = urlparse.parse_qs(field_data) 

    Dies zieht urlencodierte POST-Daten aus dem Dokumentinhalt und analysiert es ein Dict mit der richtigen urldecoding

    Haben Sie mit Bibliotheken wie CherryPy untersucht ? Sie bieten einen viel schnelleren Weg, um diese Dinge zu behandeln als BaseHTTPServer.

    Grundlegende HTTP-Anforderungsparameter-Unterstützung wird im CGI Modul zur Verfügung gestellt . Der empfohlene Mechanismus zur Handhabung von Formulardaten ist die Klasse cgi.FieldStorage .

    Um die Formulardaten zu erhalten, ist es am besten, die FieldStorage Klasse zu verwenden. Die anderen in diesem Modul definierten Klassen sind meist für Rückwärtskompatibilität vorgesehen. Instantiate es genau einmal, ohne Argumente. Dies liest den Formularinhalt aus der Standard-Eingabe oder der Umgebung (abhängig vom Wert der verschiedenen Umgebungsvariablen, die nach dem CGI-Standard eingestellt sind). Da es eine Standard-Eingabe verbrauchen kann, sollte es nur einmal instanziiert werden.

    Die FieldStorage Instanz kann wie ein Python-Wörterbuch indiziert werden. Es ermöglicht die Mitgliedschaft Prüfung mit dem in-Operator, und unterstützt auch die Standard-Wörterbuch-Methoden- keys() und die integrierte Funktion len() . Formularfelder mit leeren Zeichenfolgen werden ignoriert und erscheinen nicht im Wörterbuch; Um solche Werte zu behalten, einen wahren Wert für den optionalen Schlüsselwort keep_blank_values ​​bei der Erstellung der FieldStorage Instanz.

    Der folgende Code (der davon ausgeht, dass der Content-Type-Header und die Leerzeile bereits gedruckt wurden) überprüft, ob die Felder name und addr beide auf einen nicht leeren String gesetzt sind:

     form = cgi.FieldStorage() if "name" not in form or "addr" not in form: print "<H1>Error</H1>" print "Please fill in the name and addr fields." return print "<p>name:", form["name"].value print "<p>addr:", form["addr"].value #...further form processing here... 
    Python ist die beste Programmiersprache der Welt.