Come vengono gestite le variabili POST e GET in Python?


135

In PHP puoi semplicemente usare le variabili $_POSTPOST e $_GETGET (Query string). Qual è l'equivalente in Python?


Stai scrivendo uno script CGI, mod_python o un'applicazione Django (o altro framework)? La risposta dipende da ulteriori informazioni ...
Rob,

puoi fornire un codice di esempio per ognuno di questi?
Fai clic su Aggiorna il

2
CGI, mod_python, Django, CherryPy e Pylons non sono esempi di codice. Sono Python Web Frameworks che gestiscono GET e POST. Vedi wiki.python.org/moin/WebFrameworks per informazioni. Alla tua domanda - come posta - non è possibile rispondere.
S.Lott

Risposte:


246

supponiamo di pubblicare un modulo html con questo:

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

Se si utilizza cgi crudo :

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

Se usi Django , Pylons , Flask o Pyramid :

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

Utilizzando Turbogears , Cherrypy :

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

Web.py :

form = web.input()
print form.username

Werkzeug :

print request.form['username']

Se si utilizza Cherrypy o Turbogears, è anche possibile definire la funzione del gestore prendendo direttamente un parametro:

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

Quindi dovrai davvero scegliere uno di quei framework.


18
Usando import cgi, non è vero print form["username"].value?
J. Katzwinkel,

Sto usando Bottleciò che credo usi wsgi, qualcuno potrebbe pubblicare l'equivalente da utilizzare in quello scenario? La risposta di cui sopra è la spiegazione più chiara che ho incontrato, semplicemente non include il mio scenario.
user1063287

2
FieldStorage è rotto in python3, potresti riscontrare problemi con esso. bugs.python.org/issue6234
NuclearPeon

2
Mi permetta di chiarire il mio commento precedente; questa pagina: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode lo spiega meglio. Non utilizzare FieldStorage () in Python 3 a causa di problemi di codifica.
NuclearPeon

Per Flask è un po 'diverso: request.args.get (' username ')
Damjan Pavlica,

35

So che questa è una vecchia domanda. Tuttavia è sorprendente che non sia stata data una buona risposta.

Innanzitutto la domanda è completamente valida senza menzionare il quadro. Il CONTESTO è un'equivalenza del linguaggio PHP. Sebbene ci siano molti modi per ottenere i parametri della stringa di query in Python, le variabili del framework sono semplicemente popolate. In PHP, $_GETe $_POSTsono anche variabili di convenienza. Vengono analizzati rispettivamente da QUERY_URI e php: // input.

In Python, queste funzioni sarebbero os.getenv('QUERY_STRING')e sys.stdin.read(). Ricorda di importare i moduli os e sys.

Dobbiamo stare attenti con la parola "CGI" qui, specialmente quando parliamo di due lingue e dei loro punti in comune quando si interfaccia con un web server. 1. Il CGI, come protocollo, definisce il meccanismo di trasporto dei dati nel protocollo HTTP. 2. Python può essere configurato per essere eseguito come script CGI in Apache. 3. Il modulo CGI in Python offre alcune funzioni utili.

Poiché il protocollo HTTP è indipendente dalla lingua e che l'estensione CGI di Apache è anche indipendente dalla lingua, ottenere i parametri GET e POST dovrebbe comportare solo differenze di sintassi tra le lingue.

Ecco la routine Python per popolare un dizionario 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

e per 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

Ora puoi accedere ai campi come segue:

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

Devo anche sottolineare che il modulo CGI non funziona bene. Considera questa richiesta HTTP:

POST / test.py?user_id=6

user_name=Bob&age=30

L'utilizzo CGI.FieldStorage().getvalue('user_id')provocherà un'eccezione puntatore null poiché il modulo controlla ciecamente i dati POST, ignorando il fatto che una richiesta POST può contenere anche parametri GET.


Ho AttributeError: 'NoneType' object has no attribute 'split'CGIPython
riscontrato

1
A proposito dell'errore @candlejack ha detto, prova a ottenere argomenti come questo POST.get('user_name', 'default_value').
George Siggouroglou,

@GeorgeSiggouroglou La cosa 'default_value' ha risolto il mio problema. Grazie!
umbe1987,

1
Sicuramente la mia risposta preferita finora! +1
umbe1987

QUERY_STRING non è un indice valido su Mac
Samuel Ev

31

Ho trovato la risposta di nosklo molto ampia e utile! Per quelli, come me, che potrebbero trovare utile accedere direttamente ai dati della richiesta non elaborata, vorrei aggiungere il modo di farlo:

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

Sto cercando di chiamare un metodo in un file cgi. Un URL di esempio è http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod. Sono correlate le seguenti variabili ambientali: os.environ.get('PATH_INFO')che ottiene il nome del metodo (ad esempio: / ThisIsMyMethod) e os.environ.get('SCRIPT_NAME')che fornisce il percorso dello script dalla cartella principale dell'host Web (ad esempio: /cgi-bin/cgi.py). Nel mio caso, QUERY_STRING è vuoto, poiché sto usando POST.
NuclearPeon

28

Sono memorizzati nell'oggetto fieldstorage CGI.

import cgi
form = cgi.FieldStorage()

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

2
-1. ci sono alcune rappresentazioni dell'oggetto richiesta, a seconda del libs / framework usato.
bruno desthuilliers,

10
Non sono sicuro del motivo per cui hai fatto -1. Voglio dire, quello che ho dato funziona. Forse non è in grado di usare un framework. Inoltre, la maggior parte dei framework non lo usa solo in background?
Evan Fosmark,

4
È stato stupido fare -1, ho +1 per bilanciarlo, inoltre penso che questo sia il metodo migliore in quanto restituisce una puntura (che è ciò che viene chiesto)
joedborg

1
@Liam Non sono sicuro del motivo per cui stai ricevendo None, ma questo post ha più di 6 anni, quindi non avrei dubbi sul fatto che le cose siano cambiate.
Evan Fosmark,

@EvanFosmark Non sto ottenendo valori utilizzando questo. Quando stampo il valore restituito da cgi.FeildStorage, questo è l'output di FieldStorage (None, None, []). Ho pubblicato una domanda completa qui stackoverflow.com/questions/38024516/… Qualsiasi aiuto sarà apprezzato.
Chor Sipahi,

1

Dipende in qualche modo da ciò che usi come framework CGI, ma sono disponibili nei dizionari accessibili al programma. Vorrei indirizzarti ai documenti, ma in questo momento non riesco a contattare python.org. Ma questa nota su mail.python.org ti darà un primo puntatore . Guarda le librerie Python CGI e URLLIB per ulteriori informazioni.

Aggiornare

Ok, quel link è stato eliminato. Ecco il ref di base wsgi


Se non sei abbastanza ambizioso da seguire un link, non sono abbastanza ambizioso da tagliare e incollare se dal link.
Charlie Martin,

1
e ora il link è morto ed è per questo che tutti odiano le risposte in questo modo e le riducono. Congratulazioni.
John Tyree,

2
Sai, ogni volta che ricevo un commento da qualcuno che lamenta che una risposta di cinque - quasi sei anni ora ha un collegamento interrotto, senza, diciamo, aggiungere un collegamento di sostituzione, posso scommettere che è qualcuno con un rappresentante <1000.
Charlie Martin,

Se avessi saputo dove andare per il link di sostituzione (suggerimento, non l'ho fatto perché il tuo link non funzionava) non avrei cercato questa domanda.
John Tyree,

Si può sempre provare il suggerimento di 'CGI e librerie Python urllib' suppongo.
Charlie Martin,

0

Python è solo una lingua, per ottenere dati GET e POST, è necessario un framework Web o toolkit scritto in Python. Django è uno, come sottolinea Charlie, i moduli standard cgi e urllib sono altri. Sono disponibili anche Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi, ecc, ecc.

In Django, le tue funzioni di visualizzazione ricevono un argomento request che ha request.GET e request.POST. Altri framework lo faranno diversamente.


13
"per ottenere dati GET e POST, è necessario un framework Web o toolkit scritto in Python" - Semplicemente non vero
James Tomasino,

2
Sono d'accordo con James, se sono scritti in Python possono chiaramente essere riscritti secondo le tue preferenze.
Robin Sandström,

Ok, sono un nuovo arrivato in Python e ho pensato che non fosse possibile usare un framework. La mia domanda è: qual è la strada? Non sto usando alcun framework e ho avuto apache2 per servire uno script Python. Sarà bello mostrare un modo semplice morto come l'uso di $ _GET o $ _POST in php.
sensei nero,

1
@JamesTomasino Nel contesto della domanda, è vero.
Peter - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.