2009-02-09 26 views
30

Parece que no puedo entender cómo acceder a datos POST utilizando WSGI. Probé el ejemplo en el sitio web wsgi.org y no funcionó. Estoy usando Python 3.0 ahora mismo. Por favor, no recomiende un framework WSGI ya que eso no es lo que estoy buscando.Acceso a los datos POST de WSGI

Me gustaría descubrir cómo ponerlo en un objeto fieldstorage.

+0

FWIW, en este momento todavía no hay especificaciones WSGI para Python 3.0, por lo que cualquier cosa que hagas será un desperdicio de esfuerzo ya que cualquier actualización de especificación final puede no ser compatible con cualquier intento de implementar lo que puede decir para Python 3.0 . Para aplicaciones WSGI, es mejor que se quede con Python 2.X. –

+6

@GrahamDumpleton Ya no: http://www.python.org/dev/peps/pep-3333/ (No engañemos a las personas que lean esto un poco más tarde como yo, ahorrándoles también su tiempo) – JeromeJ

+2

@JermoeJ - Escribió el comentar en 2009, y usted está respondiendo en 2013; No creo que estuviera tratando de engañar a nadie. :) – Sam

Respuesta

28

Suponiendo que usted está tratando de obtener sólo los datos POST en un objeto FieldStorage:

# env is the environment handed to you by the WSGI server. 
# I am removing the query string from the env before passing it to the 
# FieldStorage so we only have POST data in there. 
post_env = env.copy() 
post_env['QUERY_STRING'] = '' 
post = cgi.FieldStorage(
    fp=env['wsgi.input'], 
    environ=post_env, 
    keep_blank_values=True 
) 
+0

Esto no funciona en Python 3.0 - tiene un problema con el wsgi.input que devuelve bytes en lugar de cadenas. :(Necesito una forma de hacer esto en Python 3.0 ... –

+0

¿Qué controlador WSGI estás usando? Si uso el CGIHandler incorporado funciona bien para mí. Tengo un archivo "post.cgi" en mi servidor local con los contenidos en http://pastebin.com/f40849562 funcionando perfectamente –

+0

¿Cuál es la clase wsgi.input? Si es un BufferedIOBase, entonces debería ser capaz de envolverlo en un TextIOWrapper para que el cgi .FieldStorage puede usarlo. –

-1

Le sugiero que observe cómo algunos marcos lo hacen para un ejemplo. (No estoy recomendando uno solo, simplemente utilizarlos como un ejemplo.)

Aquí está el código de Werkzeug:

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/wrappers.py#L150

que llama a

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/utils.py#L1420

Es una Es un poco complicado resumir aquí, así que no lo haré.

+0

Todavía no funciona en Python 3.0, y eso es lo que estoy buscando. Gracias de todas formas, sin embargo. –

+1

-1 pregunta para que no se muestren los marcos –

+2

@FireCrow Sin embargo, mirar cómo los marcos parecen ser una buena idea. Esto realmente no está aconsejando una forma de marco. – JeromeJ

22
body= '' # b'' for consistency on Python 3.0 
try: 
    length= int(environ.get('CONTENT_LENGTH', '0')) 
except ValueError: 
    length= 0 
if length!=0: 
    body= environ['wsgi.input'].read(length) 

Tenga en cuenta que WSGI aún no se ha especificado completamente para Python 3.0, y gran parte de la infraestructura WSGI popular no se ha convertido (o ha sido 2to3d, pero no han sido evaluados correctamente). (Incluso wsgiref.simple_server no se ejecutará.) Estás en un mal momento haciendo WSGI en 3.0 hoy.

+0

Sí, tuve problemas para que wsgiref funcione. Terminé implementando el parche. –

+0

http://www.python.org/dev/peps/pep-3333/ WSGI PEP para Python 3. – JeromeJ

3

Esto funcionó para mí (en Python 3.0):

import urllib.parse 

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True) 
1

Incluso más corto

l = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0 
body = env['wsgi.input'].read(l) if l > 0 else '' 

Este código funciona en producción.