[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