¿Cómo se manejan las variables POST y GET en Python?


135

En PHP solo puede usar $_POSTpara POST y $_GETpara variables GET (cadena de consulta). ¿Cuál es el equivalente en Python?


¿Estás escribiendo un script CGI, mod_python o una aplicación Django (u otro framework)? La respuesta depende de un poco más de información ...
Rob

¿Puedes proporcionar un código de muestra para cada uno de estos?
Haga clic en Upvote el

2
CGI, mod_python, Django, CherryPy y Pylons no son ejemplos de código. Son Python Web Frameworks que manejan GET y POST. Consulte wiki.python.org/moin/WebFrameworks para obtener información. Su pregunta, como se le preguntó, no puede ser respondida.
S.Lott

Respuestas:


246

supongamos que está publicando un formulario html con esto:

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

Si usa cgi sin procesar :

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

Si usa 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']

Si usa Cherrypy o Turbogears, también puede definir su función de controlador tomando un parámetro directamente:

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

Entonces realmente tendrá que elegir uno de esos marcos.


18
Usando import cgi, ¿no print form["username"].value?
J. Katzwinkel

Estoy usando Bottlelo que creo que usa wsgi, ¿alguien podría publicar el equivalente a usar en ese escenario? La respuesta anterior es la explicación más clara que he encontrado, simplemente no incluye mi escenario.
user1063287

2
FieldStorage está roto en python3, puede experimentar problemas con él. bugs.python.org/issue6234
NuclearPeon

2
Permítame aclarar mi comentario anterior; esta página: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode lo explica mejor. No use FieldStorage () en python 3 debido a problemas de codificación.
NuclearPeon

Para Flask es un poco diferente: request.args.get ('username')
Damjan Pavlica

35

Sé que esta es una vieja pregunta. Sin embargo, es sorprendente que no se haya dado una buena respuesta.

En primer lugar, la pregunta es completamente válida sin mencionar el marco. El CONTEXTO es una equivalencia de lenguaje PHP. Aunque hay muchas formas de obtener los parámetros de la cadena de consulta en Python, las variables del marco se completan convenientemente. En PHP, $_GETy $_POSTtambién son variables de conveniencia. Se analizan desde QUERY_URI y php: // input respectivamente.

En Python, estas funciones serían os.getenv('QUERY_STRING')y sys.stdin.read(). Recuerde importar módulos os y sys.

Tenemos que tener cuidado con la palabra "CGI" aquí, especialmente cuando hablamos de dos idiomas y sus puntos en común al interactuar con un servidor web. 1. CGI, como protocolo, define el mecanismo de transporte de datos en el protocolo HTTP. 2. Python se puede configurar para ejecutarse como un script CGI en Apache. 3. El módulo CGI en Python ofrece algunas funciones convenientes.

Dado que el protocolo HTTP es independiente del idioma, y ​​que la extensión CGI de Apache también es independiente del idioma, obtener los parámetros GET y POST solo debería tener diferencias de sintaxis entre los idiomas.

Aquí está la rutina de Python para llenar un diccionario 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

y para 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

Ahora puede acceder a los campos de la siguiente manera:

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

También debo señalar que el módulo CGI no funciona bien. Considere esta solicitud HTTP:

POST / test.py?user_id=6

user_name=Bob&age=30

El uso CGI.FieldStorage().getvalue('user_id')provocará una excepción de puntero nulo porque el módulo verifica ciegamente los datos POST, ignorando el hecho de que una solicitud POST también puede transportar parámetros GET.


Recibí este error: AttributeError: 'NoneType' object has no attribute 'split'uso CGIcon Python2.7
candlejack

1
Sobre el error que dijo @candlejack, intente obtener argumentos como este POST.get('user_name', 'default_value').
George Siggouroglou

@GeorgeSiggouroglou La cosa 'default_value' resolvió mi problema. ¡Gracias!
umbe1987

1
¡Definitivamente mi respuesta favorita hasta ahora! +1
umbe1987

QUERY_STRING no es un índice válido en Mac
Samuel Ev

31

¡He encontrado la respuesta de nosklo muy extensa y útil! Para aquellos, como yo, que pueden encontrar el acceso directo a los datos de solicitud sin procesar también útil, me gustaría agregar la forma de hacerlo:

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

Estoy tratando de llamar a un método en un archivo cgi. Un ejemplo de URL es http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod. Las siguientes variables ambientales están relacionadas: os.environ.get('PATH_INFO')cuál obtiene el nombre del método (por ejemplo: / ThisIsMyMethod) y os.environ.get('SCRIPT_NAME')cuál proporciona la ruta al script desde la carpeta raíz del host web (por ejemplo: /cgi-bin/cgi.py). En mi caso, QUERY_STRING está en blanco, ya que estoy usando POST.
NuclearPeon

28

Se almacenan en el objeto de almacenamiento de campos CGI.

import cgi
form = cgi.FieldStorage()

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

2
-1. hay bastantes representaciones del objeto de solicitud, dependiendo del libs / framework utilizado.
bruno desthuilliers

10
No estoy seguro de por qué hiciste -1. Quiero decir, lo que di funciona. Quizás no pueda usar un marco. Además, ¿la mayoría de los frameworks no solo usan esto en segundo plano?
Evan Fosmark

44
Era estúpido hacer -1, tengo 1 para equilibrarlo, además, creo que este es el mejor método, ya que devuelve una picadura (que es lo que se pidió)
joedborg

1
@Liam No estoy seguro de por qué no tienes ninguno, pero esta publicación tiene más de 6 años, por lo que no dudaría si las cosas han cambiado.
Evan Fosmark

@EvanFosmark Estoy obteniendo valores None al usar esto. Cuando imprimo el valor devuelto por cgi.FeildStorage, esto es lo que genera FieldStorage (None, None, []). He publicado una pregunta completa aquí stackoverflow.com/questions/38024516/… Cualquier ayuda será apreciada.
Chor Sipahi

1

Depende un poco de lo que use como marco CGI, pero están disponibles en diccionarios accesibles para el programa. Te diría a los documentos, pero no estoy llegando a python.org en este momento. Pero esta nota en mail.python.org le dará un primer puntero . Mire las bibliotecas Python de CGI y URLLIB para obtener más información.

Actualizar

Bien, ese enlace se rompió. Aquí está la referencia básica de wsgi


Si no eres lo suficientemente ambicioso como para seguir un enlace, no soy lo suficientemente ambicioso como para cortar y pegarlo desde el enlace.
Charlie Martin el

1
y ahora el enlace está muerto y es por eso que todo el mundo odia respuestas como esta y las rechaza. Felicidades.
John Tyree

2
Sabes, cada vez que recibo un comentario de alguien que se queja de que una respuesta de cinco, casi seis años, ahora tiene un enlace roto, sin, digamos, agregar un enlace de reemplazo, puedo apostar que es alguien con rep <1000.
Charlie Martin

Si supiera a dónde ir para el enlace de reemplazo (pista, no lo hice porque su enlace no funcionó) no habría estado buscando esta pregunta.
John Tyree

Siempre podría intentar la sugerencia sobre 'CGI y URLLIB python libs', supongo.
Charlie Martin

0

Python es solo un lenguaje, para obtener datos GET y POST, necesita un marco web o kit de herramientas escrito en Python. Django es uno, como señala Charlie, los módulos estándar cgi y urllib son otros. También están disponibles Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi, etc., etc.

En Django, sus funciones de vista reciben un argumento de solicitud que tiene request.GET y request.POST. Otros marcos lo harán de manera diferente.


13
"para obtener datos GET y POST, necesita un marco web o un kit de herramientas escrito en Python" - Simplemente no es cierto
James Tomasino

2
Estoy de acuerdo con James, si están escritos en Python, claramente se pueden volver a escribir según sus preferencias.
Robin Sandström

Ok, soy un recién llegado a Python y pensé que no podía ser posible que tuviera que usar un framework. Mi pregunta es ¿cuál es el camino? No estoy usando ningún marco y tuve apache2 servir un script de Python. Será bueno mostrar una forma simple como el uso de $ _GET o $ _POST en php.
negro sensei

1
@JamesTomasino En el contexto de la pregunta, es cierto.
peterh - Restablece a Monica el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.