Recoger parámetros de un formulario con Python

De ChuWiki

Un formulario estático[editar]

Supongamos que en una página web hacemos un formulario y que el "submit" de dicho formulario llama a una función de una página Python. El formulario podría ser así

<form action="fichero.py/funcion" method="post">
<p>Tu nombre: <input type="text" name="nombre" value=""/></p>
<p><input type="submit" value="OK"/></p>
</form>

es básicamente un formulario con una caja de texto para pedir "tu nombre" y un botón "OK" que llamaría a la funcion "funcion" dentro del fichero fichero.py.

Dentro del fichero.py podemos hacer la función así de fácil

def funcion (req, nombre):
   ...

donde req es un Request de Python a través del que podemos obtener cosas relativas a la petición, como IP del cliente, URL, etc. A partir de ahí, si ponemos variables de nombres iguales a los nombres del formulario, Python se encargará de rellenarlos. De esta forma, la variable nombre de la función quedará automáticamente rellena con el "value" del formulario correspondiente al name="nombre". Esto es válido para cualquier número de campos del formulario/parámetros de la función, tanto si el método del formulario es GET o POST.


Formularios dinámicos[editar]

En un momento dado podemos querer que el número de campos del formulario no sea fijo, sino que, por ejemplo, el número de campos dependa de una consulta en base de datos. Imagina, por ejemplo, que en una tabla de base de datos tenemos los equipos de futbol de una liga. Queremos un formulario que para cada uno de los equipos nos pida el número de goles que ha marcado en el último partido. El formulario, en pseudocodigo, podría ser así

<form action="fichero.py/funcion" method="get">
equipos = consulta en bd de equipos
para cada equipo en equipos
   <p>Pon los goles de %equipo%<input type="text" name="%equipo%" value=""/></p>
<p><input type="submit" value="OK"/></p>
</form>

La pega de esto es que no sabemos a priori los nombres de los equipos, por lo que no podemos hacer la función python con los parámetros cuyas variables sean dichos nombres. Ni siquiera sabemos el número de parámetros que debemos poner, puesto que no sabemos siquiera cuántos equipos hay.

El siguiente método para resolver esto sólo funciona si el método del formulario es GET. Básicamente, en nuestra función Python podemos poner esto

def funcion(req):
   argumentos = req.args

El atributo args del objeto Request req nos devuelve la cadena de la URL que representa los parámetros. Es decir, si después de rellenar el formulario y pulsar "OK", la url se asemeja a esto http://localhost/fichero.py/funcion?barsa=1&madrid=1&sporting=2 entonces req.args vale "barsa=1&madrid=1&sporting=1"

Esto nos permite separar y obtener cada uno de los parámetros, con su nombre y valor, usando la función split() de las cadenas de Python

def funcion(req):
   parametros = req.args.split('&')
   for parametro in parametros:
      nombre,valor  = parametro.split('=')
      ...

Al hacer el split('&') tenemos en parametros cadenas del estilo "barsa=1", "madrid=1" y "sporting=2". Para cada una de estas cadenas, hacemos el split('=') y tenemos las parejas nombre,valor, de forma que nombre valdría "barsa" y valor "1" para la primera cadena.

Enlaces[editar]