org - Come vengono gestite le variabili POST e GET in Python?





2.7 example (6)


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

Prima di tutto la domanda è completamente valida senza menzionare la struttura. Il CONTEXT è l'equivalenza del linguaggio PHP. Sebbene ci siano molti modi per ottenere i parametri della stringa di query in Python, le variabili framework sono semplicemente popolate. In PHP, $ _GET e $ _POST sono 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 (). Ricordarsi di importare i moduli os e sys.

Dobbiamo stare attenti con la parola "CGI" qui, specialmente quando si parla di due lingue e dei loro aspetti comuni quando si interfaccia con un server web. 1. 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 riportare solo le 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 di cgi.FieldStorage (). Getvalue ('user_id') causerà un'eccezione di puntatore nullo perché il modulo controlla in modo cieco i dati POST, ignorando il fatto che una richiesta POST può portare anche i parametri GET.

In PHP puoi usare $_POST per POST e $_GET per le variabili GET (stringa di query). Qual è l'equivalente in Python?




Python è solo un linguaggio, per ottenere i dati GET e POST, è necessario un framework web o un 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, etc, ecc.

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




Dipende in qualche modo da ciò che usi come framework CGI, ma sono disponibili in dizionari accessibili al programma. Ti indicherò i documenti, ma non sto passando a python.org in questo momento. Ma questa nota su mail.python.org ti darà un primo puntatore . Guarda le librerie CGI e URLLIB Python per maggiori informazioni.

Aggiornare

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




supponi 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

Usando 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 questi quadri.




Ho trovato la risposta di nosklo molto ampia e utile! Per quelli, come me, che potrebbero trovare utile l'accesso ai dati grezzi della richiesta, vorrei aggiungere il modo per 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()



Un uso per i metaclassi è l'aggiunta automatica di nuove proprietà e metodi a un'istanza.

Ad esempio, se guardi i modelli di Django , la loro definizione sembra un po 'confusa. Sembra che tu stia solo definendo le proprietà della classe:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

Tuttavia, durante il runtime gli oggetti Person sono riempiti con tutti i tipi di metodi utili. Guarda la source di alcune incredibili metacallerie.





python post get