In PHP können Sie nur $_POST
für POST- und $_GET
für GET-Variablen (Query String) verwenden. Was ist das Äquivalent in Python?
In PHP können Sie nur $_POST
für POST- und $_GET
für GET-Variablen (Query String) verwenden. Was ist das Äquivalent in Python?
Antworten:
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
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.
import cgi
, nicht wahr print form["username"].value
?
Bottle
dem 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.
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 $_GET
und $_POST
sind 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.
AttributeError: 'NoneType' object has no attribute 'split'
Verwendung CGI
mit Python
2,7
POST.get('user_name', 'default_value')
.
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()
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.
Sie werden im CGI-Feldspeicherobjekt gespeichert.
import cgi
form = cgi.FieldStorage()
print "The user entered %s" % form.getvalue("uservalue")
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
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.