[Python-es] Problema extraño con cgi
gerardo Juarez
gerardojuarez en buyteknet.info
Sab Dic 18 02:33:48 CET 2010
Chema Cortes wrote:
> El día 17 de diciembre de 2010 01:38, gerardo Juarez
> <gerardojuarez en buyteknet.info> escribió:
>
>> Hola, tengo un problema muy extrano con cgi.
>> Recibo datos de un servidor via un URL con argumentos. Hago lo siguiente:
>>
>> import cgi
>> fm = cgi.FieldStorage()
>>
>> Y trato de obtener los valores con fm.getvalue(k) donde k es cada uno de
>> los valores.
>>
>> Ahora bien, lo que esta sucediendo es que cada vez que hacen contacto con mi
>> script,
>> recibo argumentos como CONTEXT, cmd, form_charset, que ni me sirven ni los
>> estaba esperando.
>> Mi script reporta un error, claro, pero en la linea de URL del navegador me
>> muestra el
>> URL que supuestamente debio de recibir mi script, y en él *sí* están los
>> argumentos
>> que estoy esperando.
>>
>> Existe alguna forma en que se pueda romper la integridad de cómo
>> cgi.FieldStorage() procesa y
>> separa los campos de una forma? Porque no se me ocurre otra forma de que
>> pasara esto.
>>
>
> No sé a qué te refieres con romper la "integridad" del FieldStorage,
> pero puedes probar si la url está bien codificada con
> 'urlparse.parse_qs'
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
Muchas gracias Chema. Me ayudó a resolver el problema. Documento de qué
se trata:
Tengo un script que debe recibir una variable 'tx' de una forma. La
documentación me dice que el método de envío
es GET, por lo tanto viene como una "query_string" pegada al URL de mi
script. El código de la forma sin
embargo viene así:
<form name="nombre"
action="http://mi_sitio/cgi-bin/mi_script?tx=23sc432cs3ws" method="POST">
<input type=hidden name=CONTEXT value="3o4dflakoiwhkad">
... siguen otros campos de nombre extraño e indescifrable
</form>
Como se puede ver el método es POST, pero al mismo tiempo hay una
query_string pegada a "action".
cgi.FieldStorage() sólo ve los parámetros de adentro de la forma, y no
la query_string, por lo que hay
que buscar la variable 'tx' en ambos lados, si no se sabe en dónde la
mandaron:
fm = cgi.FieldStorage() # la forma
parms = cgi.parse_qs(os.environ['QUERY_STRING']) # la query_string
# busca en forma
try:
tx = fm['tx'].value
log_error("Recibi tx= %s" % tx)
except KeyError:
# busca en query string
try:
tx = parms['tx'][0]
log_error('Recibi tx en QS = %s' % tx)
except KeyError:
resp.error('no recibi la variable tx')
Espero le sirva a alguien.
saludos
Gerardo
Más información sobre la lista de distribución Python-es