web-dev-qa-db-fra.com

Comment les variables POST et GET sont-elles gérées en Python?

Dans PHP vous pouvez simplement utiliser $_POST pour POST et $_GET pour les variables GET (chaîne de requête). Quel est l'équivalent en Python?

134
Click Upvote

supposons que vous publiez un formulaire html avec ceci:

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

Si vous utilisez raw cgi :

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

Si vous utilisez Django , Pylônes , Flacon ou Pyramide :

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

Utilisation de Turbogears , Cherrypy :

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

Web.py :

form = web.input()
print form.username

Werkzeug :

print request.form['username']

Si vous utilisez Cherrypy ou Turbogears, vous pouvez également définir votre fonction de gestionnaire en prenant directement un paramètre:

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

Vous devrez donc vraiment choisir l’un de ces cadres.

235
nosklo

Je sais que c'est une vieille question. Pourtant, il est surprenant qu'aucune bonne réponse n'ait été donnée.

Tout d’abord, la question est tout à fait valable sans mentionner le cadre. Le CONTEXTE est l’équivalence linguistique PHP. Bien qu'il existe de nombreuses façons d'obtenir les paramètres de chaîne de requête en Python, les variables de structure sont simplement renseignées. En PHP, $ _GET et $ _POST sont aussi des variables de commodité. Ils sont analysés à partir de QUERY_URI et php: // input, respectivement.

En Python, ces fonctions seraient os.getenv ('QUERY_STRING') et sys.stdin.read (). N'oubliez pas d'importer les modules os et sys.

Nous devons faire attention ici avec le mot "CGI", en particulier lorsque nous parlons de deux langues et de leurs points communs lors de l’interfaçage avec un serveur Web. 1. CGI, en tant que protocole, définit le mécanisme de transport de données dans le protocole HTTP. 2. Python peut être configuré pour s'exécuter en tant que script CGI dans Apache. 3. Le module cgi dans Python offre des fonctions pratiques.

Étant donné que le protocole HTTP est indépendant du langage et que l'extension CGI d'Apache est également indépendante du langage, obtenir les paramètres GET et POST ne devrait porter que des différences de syntaxe entre les langues.

Voici la routine Python pour remplir un dictionnaire GET:

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

et pour 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

Vous pouvez maintenant accéder aux champs comme suit:

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

Je dois également souligner que le module cgi ne fonctionne pas bien. Considérons cette requête HTTP:

POST / test.py?user_id=6

user_name=Bob&age=30

L'utilisation de cgi.FieldStorage (). Getvalue ('user_id') provoquera une exception de pointeur null car le module vérifie à l'aveugle les données POST, ignorant le fait qu'une demande POST peut également contenir des paramètres GET.

31
Schien

J'ai trouvé la réponse de nosklo très complète et utile! Pour ceux, comme moi, qui pourraient trouver utile d'accéder directement aux données de demande brutes également, j'aimerais ajouter le moyen de le faire:

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()
31
Tom

Ils sont stockés dans l'objet CGI fieldstorage.

import cgi
form = cgi.FieldStorage()

print "The user entered %s" % form.getvalue("uservalue")
27
Evan Fosmark

Cela dépend un peu de ce que vous utilisez comme cadre CGI, mais ils sont disponibles dans des dictionnaires accessibles au programme. Je vous indiquerais la documentation, mais je ne parle pas de python.org pour le moment. Mais cette note sur mail.python.org vous donnera un premier pointeur . Regardez le CGI et URLLIB Python libs pour plus.

Mettre à jour

Ok, ce lien a éclaté. Voici le référence wsgi de base

2
Charlie Martin

Python n’est qu’un langage, pour obtenir les données GET et POST, vous avez besoin d’un framework Web ou d’une boîte à outils écrite en Python. Django en est un, comme le souligne Charlie , les modules standard cgi et urllib en sont d’autres, ainsi que Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi, etc.

Dans Django, vos fonctions de vue reçoivent un argument de requête contenant les commandes request.GET et request.POST. D'autres cadres le feront différemment.

0
Ned Batchelder