Wie werden POST- und GET-Variablen in Python behandelt?

135

In PHP können Sie nur $_POSTfür POST- und $_GETfür GET-Variablen (Query String) verwenden. Was ist das Äquivalent in Python?

Klicken Sie auf Upvote
quelle
Schreiben Sie ein CGI-Skript, mod_python oder eine Django-Anwendung (oder eine andere Framework-Anwendung)? Die Antwort hängt von ein bisschen mehr Info ab ...
Rob
Können Sie für jeden dieser Beispiele einen Beispielcode bereitstellen?
Klicken Sie auf Upvote
2
CGI, mod_python, Django, CherryPy und Pylons sind keine Codebeispiele. Es handelt sich um Python Web Frameworks, die GET und POST verarbeiten. Weitere Informationen finden Sie unter wiki.python.org/moin/WebFrameworks . Ihre Frage kann - wie gestellt - nicht beantwortet werden.
S.Lott

Antworten:

246

Angenommen, Sie veröffentlichen ein HTML-Formular mit folgendem Inhalt:

<input type="text" name="username">

Bei Verwendung von rohem CGI :

import cgi
form = cgi.FieldStorage()
print form["username"]

Bei Verwendung von Django , Pylonen , Kolben oder Pyramiden :

print request.GET['username'] # for GET form method
print request.POST['username'] # for POST form method

Mit Turbogears , CherryPy :

from cherrypy import request
print request.params['username']

Web.py :

form = web.input()
print form.username

Werkzeug :

print request.form['username']

Wenn Sie Cherrypy oder Turbogears verwenden, können Sie Ihre Handlerfunktion auch definieren, indem Sie einen Parameter direkt verwenden:

def index(self, username):
    print username

Google App Engine :

class SomeHandler(webapp2.RequestHandler):
    def post(self):
        name = self.request.get('username') # this will get the value from the field named username
        self.response.write(name) # this will write on the document

Sie müssen sich also wirklich für eines dieser Frameworks entscheiden.

nosklo
quelle
18
Verwenden import cgi, nicht wahr print form["username"].value?
J. Katzwinkel
Ich verwende, von Bottledem ich glaube wsgi, dass es verwendet wird. Könnte jemand das Äquivalent für die Verwendung in diesem Szenario veröffentlichen? Die obige Antwort ist die klarste Erklärung, die mir begegnet ist. Sie enthält einfach nicht mein Szenario.
user1063287
2
FieldStorage ist in Python3 defekt. Möglicherweise treten Probleme damit auf. bugs.python.org/issue6234
NuclearPeon
2
Gestatten Sie mir, meinen vorherigen Kommentar zu erläutern. Diese Seite: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode erklärt es besser. Verwenden Sie FieldStorage () in Python 3 aufgrund von Codierungsproblemen nicht.
NuclearPeon
Für Flask ist es etwas anders: request.args.get ('Benutzername')
Damjan Pavlica
35

Ich weiß, dass dies eine alte Frage ist. Es ist jedoch überraschend, dass keine gute Antwort gegeben wurde.

Zuallererst ist die Frage vollständig gültig, ohne den Rahmen zu erwähnen. Der KONTEXT ist eine PHP-Sprachäquivalenz. Obwohl es in Python viele Möglichkeiten gibt, die Parameter für Abfragezeichenfolgen abzurufen, werden die Framework-Variablen nur bequem ausgefüllt. In PHP $_GETund $_POSTsind auch Convenience-Variablen. Sie werden von der Eingabe QUERY_URI bzw. php: // analysiert.

In Python wären diese Funktionen os.getenv('QUERY_STRING')und sys.stdin.read(). Denken Sie daran, OS- und Sys-Module zu importieren.

Wir müssen hier mit dem Wort "CGI" vorsichtig sein, insbesondere wenn wir über zwei Sprachen und ihre Gemeinsamkeiten bei der Schnittstelle mit einem Webserver sprechen. 1. CGI definiert als Protokoll den Datentransportmechanismus im HTTP-Protokoll. 2. Python kann so konfiguriert werden, dass es in Apache als CGI-Skript ausgeführt wird. 3. Das CGI-Modul in Python bietet einige praktische Funktionen.

Da das HTTP-Protokoll sprachunabhängig ist und die CGI-Erweiterung von Apache auch sprachunabhängig ist, sollte das Abrufen der GET- und POST-Parameter nur sprachübergreifende Syntaxunterschiede aufweisen.

Hier ist die Python-Routine zum Auffüllen eines GET-Wörterbuchs:

GET={}
args=os.getenv("QUERY_STRING").split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k,v=arg.split('='); GET[k]=v

und für POST:

POST={}
args=sys.stdin.read().split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k, v=arg.split('='); POST[k]=v

Sie können jetzt wie folgt auf die Felder zugreifen:

print GET.get('user_id')
print POST.get('user_name')

Ich muss auch darauf hinweisen, dass das CGI-Modul nicht gut funktioniert. Betrachten Sie diese HTTP-Anfrage:

POST / test.py?user_id=6

user_name=Bob&age=30

Die Verwendung von CGI.FieldStorage().getvalue('user_id')führt zu einer Nullzeigerausnahme, da das Modul die POST-Daten blind überprüft und die Tatsache ignoriert, dass eine POST-Anforderung auch GET-Parameter enthalten kann.

Schien
quelle
Ich habe diesen Fehler: AttributeError: 'NoneType' object has no attribute 'split'Verwendung CGImit Python2,7
candlejack
1
Über den Fehler, den @candlejack sagte, versuchen Sie, die Argumente wie folgt zu erhalten POST.get('user_name', 'default_value').
George Siggouroglou
@ GeorgeSiggouroglou Die Sache 'default_value' hat mein Problem gelöst. Vielen Dank!
umbe1987
1
Auf jeden Fall meine bisherige Lieblingsantwort! +1
umbe1987
QUERY_STRING ist kein gültiger Index für Mac
Samuel Ev
31

Ich fand die Antwort von nosklo sehr umfangreich und nützlich! Für diejenigen wie mich, die den direkten Zugriff auf die Rohdaten der Anfrage möglicherweise ebenfalls nützlich finden, möchte ich die Möglichkeit hinzufügen, dies zu tun:

import os, sys

# the query string, which contains the raw GET data
# (For example, for http://example.com/myscript.py?a=b&c=d&e
# this is "a=b&c=d&e")
os.getenv("QUERY_STRING")

# the raw POST data
sys.stdin.read()
Tom
quelle
Ich versuche, eine Methode in einer CGI-Datei aufzurufen . Eine Beispiel-URL ist http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod. Die folgenden Umgebungsvariablen hängen zusammen: Sie erhalten os.environ.get('PATH_INFO')den Methodennamen (z. B. / ThisIsMyMethod) und os.environ.get('SCRIPT_NAME')den Pfad zum Skript aus dem Stammordner des Webhosts (z. B. /cgi-bin/cgi.py). In meinem Fall ist QUERY_STRING leer, da ich POST verwende.
NuclearPeon
28

Sie werden im CGI-Feldspeicherobjekt gespeichert.

import cgi
form = cgi.FieldStorage()

print "The user entered %s" % form.getvalue("uservalue")
Evan Fosmark
quelle
2
-1. Abhängig von den verwendeten Bibliotheken / Frameworks gibt es einige Darstellungen des Anforderungsobjekts.
Bruno Desthuilliers
10
Ich bin mir nicht sicher, warum du -1 getan hast. Ich meine, was ich gegeben habe, funktioniert. Vielleicht kann er kein Framework verwenden. Verwenden die meisten Frameworks dies nicht einfach im Hintergrund?
Evan Fosmark
4
War dumm, -1 zu tun, ich habe +1, um es auszugleichen, und ich denke, dies ist die beste Methode, da es einen Stich zurückgibt (was gefragt ist)
joedborg
1
@Liam Ich bin mir nicht sicher, warum du None bekommst, aber dieser Beitrag ist über 6 Jahre alt, also würde ich nicht bezweifeln, ob sich die Dinge geändert haben.
Evan Fosmark
@EvanFosmark Ich erhalte keine Werte, wenn ich dies verwende. Wenn ich den von cgi.FeildStorage zurückgegebenen Wert drucke, ist dies die Ausgabe von FieldStorage (None, None, []). Ich habe hier eine vollständige Frage gestellt. Stackoverflow.com/questions/38024516/… Jede Hilfe wird geschätzt.
Chor Sipahi
1

Es hängt etwas davon ab, was Sie als CGI-Framework verwenden, aber sie sind in Wörterbüchern verfügbar, auf die das Programm zugreifen kann. Ich würde Sie auf die Dokumente verweisen, aber ich komme gerade nicht zu python.org durch. Aber dieser Hinweis auf mail.python.org gibt Ihnen einen ersten Hinweis . Weitere Informationen finden Sie in den CGI- und URLLIB-Python-Bibliotheken.

Aktualisieren

Okay, dieser Link ist kaputt gegangen. Hier ist die grundlegende wsgi ref

Charlie Martin
quelle
Wenn Sie nicht ehrgeizig genug sind, um einem Link zu folgen, bin ich nicht ehrgeizig genug, um aus dem Link herauszuschneiden und einzufügen.
Charlie Martin
1
und jetzt ist der Link tot und deshalb hasst jeder solche Antworten und stimmt sie ab. Herzliche Glückwünsche.
John Tyree
2
Weißt du, jedes Mal, wenn ich einen Kommentar von jemandem bekomme, der meckert, dass eine fünf - fast sechs Jahre alte Antwort jetzt einen defekten Link hat, ohne beispielsweise einen Ersatzlink hinzuzufügen, kann ich wetten, dass es jemand mit rep <1000 ist.
Charlie Martin
Wenn ich gewusst hätte, wo ich den Ersatzlink finden soll (Hinweis, ich habe es nicht getan, weil Ihr Link nicht funktioniert hat), hätte ich diese Frage nicht nachgeschlagen.
John Tyree
Sie könnten immer den Hinweis über 'CGI- und URLLIB-Python-Bibliotheken' ausprobieren, nehme ich an.
Charlie Martin
0

Python ist nur eine Sprache. Um GET- und POST-Daten abzurufen, benötigen Sie ein in Python geschriebenes Webframework oder Toolkit. Django ist eines, wie Charlie betont, die Standardmodule cgi und urllib sind andere. Ebenfalls erhältlich sind Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi usw.

In Django erhalten Ihre Ansichtsfunktionen ein Anforderungsargument mit request.GET und request.POST. Andere Frameworks machen das anders.

Ned Batchelder
quelle
13
"Um GET- und POST-Daten zu erhalten, benötigen Sie ein in Python geschriebenes Webframework oder Toolkit" - Einfach nicht wahr
James Tomasino
2
Ich stimme James zu, wenn sie in Python geschrieben sind, können sie eindeutig wieder nach Ihren Wünschen geschrieben werden.
Robin Sandström
Ok, ich bin ein Neuling in Python und ich dachte, es kann nicht möglich sein, dass ich ein Framework verwenden muss. Meine Frage ist, wie ist der Weg? Ich verwende kein Framework und habe Apache2 ein Python-Skript bereitstellen lassen. Es wird schön sein, einen absolut einfachen Weg zu zeigen, wie die Verwendung von $ _GET oder $ _POST in PHP.
Black Sensei
1
@ JamesTomasino Im Zusammenhang mit der Frage ist es wahr.
Peterh - Wiedereinstellung Monica