¿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:
classSomeHandler(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.
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.
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:
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")
-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.
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.
"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.
Respuestas:
supongamos que está publicando un formulario html con esto:
Si usa cgi sin procesar :
Si usa Django , Pylons , Flask o Pyramid :
Usando Turbogears , Cherrypy :
Web.py :
Werkzeug :
Si usa Cherrypy o Turbogears, también puede definir su función de controlador tomando un parámetro directamente:
Google App Engine :
Entonces realmente tendrá que elegir uno de esos marcos.
fuente
import cgi
, ¿noprint form["username"].value
?Bottle
lo que creo que usawsgi
, ¿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.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,
$_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')
ysys.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:
y para POST:
Ahora puede acceder a los campos de la siguiente manera:
También debo señalar que el módulo CGI no funciona bien. Considere esta solicitud HTTP:
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.fuente
AttributeError: 'NoneType' object has no attribute 'split'
usoCGI
conPython
2.7POST.get('user_name', 'default_value')
.¡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:
fuente
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) yos.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.Se almacenan en el objeto de almacenamiento de campos CGI.
fuente
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
fuente
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.
fuente