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


En PHP puedes usar $_POST para las variables POST y $_GET para las variables GET (Query string). ¿Cuál es el equivalente en Python?

Author: Damjan Pavlica, 2009-01-21

6 answers

Supongamos que estás publicando un formulario html con esto:

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

Si se usa cgi sin procesar :

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

Si se usa Django, Pilones, Matraz o Pirámide :

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

Con 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

Así que realmente tendrás que elegir uno de esos frameworks.

 229
Author: nosklo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-28 11:22:01

Se almacenan en el objeto CGI fieldstorage.

import cgi
form = cgi.FieldStorage()

print "The user entered %s" % form.getvalue("uservalue")
 27
Author: Evan Fosmark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-21 04:31:44

He encontrado la respuesta de nosklo muy extensa y útil! Para aquellos, como yo, que podrían encontrar el acceso a los datos de solicitud en bruto directamente 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()
 26
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-05 22:15:06

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 la equivalencia del lenguaje PHP. Aunque hay muchas maneras de obtener los parámetros de cadena de consulta en Python, las variables del marco se rellenan convenientemente. En PHP, $_GET y _ _POST tambié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.Leer(). Recuerde importar módulos de so y sys.

Tenemos que tener cuidado con la palabra "CGI" aquí, especialmente cuando se habla de dos idiomas y sus características comunes cuando se interactúa con un servidor web. 1. CGI, como protocolo, define el mecanismo de transporte de datos en el protocolo HTTP. 2. Python puede ser configurado para ejecutarse como un script CGI en Apache. 3. El módulo cgi en Python ofrece algunas funciones de conveniencia.

Desde el protocolo HTTP es independiente del lenguaje, y que la extensión CGI de Apache también es independiente del lenguaje, obteniendo los parámetros GET y POST solo deben tener diferencias de sintaxis entre los idiomas.

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

Usando cgi.FieldStorage().getvalue ('user_id') causará una excepción de puntero nulo porque el módulo comprueba ciegamente los datos POST, ignorando el hecho de que una solicitud POST también puede llevar parámetros GET.

 23
Author: Schien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-11 23:33:02

Depende un poco de lo que se use como un framework CGI, pero están disponibles en diccionarios accesibles para el programa. Te señalaría a los médicos, pero no estoy llegando a python.org ahora mismo. Pero esta nota sobre mail.python.org le dará un primer puntero . Mira las librerías CGI y URLLIB Python para más información.

Actualización

Bien, ese enlace se rompió. Aquí está el básico wsgi ref

 3
Author: Charlie Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-05 20:22:05

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 Charlie señala, los módulos estándar cgi y urllib son otros. También están disponibles Turbogears, Pilones, CherryPy, web.py, mod_python, fastcgi, etc, etc.

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

 -1
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-21 04:30:44