¿Cómo copio wsgi.input si quiero procesar datos POST más de una vez?

En WSGI, los datos de publicación se consumen al leer el environ['wsgi.input'] objeto similar a un archivo environ['wsgi.input'] . Si un segundo elemento de la stack también desea leer datos de publicación, puede bloquear el progtwig leyendo cuando ya no haya nada más que leer.

¿Cómo debo copiar los datos de POST para que puedan procesarse varias veces?

Ve a ver el paquete de WebOb . Proporciona una funcionalidad que le permite a uno designar que wsgi.input debe ser buscable. Esto tiene el efecto de permitirle rebobinar el flujo de entrada de tal manera que el contenido se pueda reproducir a través de diferentes controladores. Incluso si no usa WebOb, la forma en que lo haga debería ser instructiva, ya que confiaría en que Ian lo haya hecho de manera adecuada. Para los resultados de búsqueda en la documentación vaya aquí .

Podría intentar volver a colocar en el entorno una réplica de la secuencia similar a un archivo:

 from cStringIO import StringIO length = int(environ.get('CONTENT_LENGTH', '0')) body = StringIO(environ['wsgi.input'].read(length)) environ['wsgi.input'] = body 

Sin embargo, hacer esto es un poco de olor. Idealmente, solo una parte del código debería analizar la cadena de consulta y el cuerpo de la publicación, y entregar los resultados a otros componentes.

Si vas a leerlo de una sola vez, siempre puedes leerlo, crea un objeto similar a un archivo CStringIO de las cosas que has leído y luego vuelve a asignarlo, así:

 import cStringIO import copy lines = [] for line in environ['wsgi.input']: lines.append(line) newlines = copy.copy(lines) environ['wsgi.input'] = cStringIO.StringIO(''.join(newlines)) 

Probablemente hay una forma más eficiente de hacer esto, pero en general encuentro que las cosas de las publicaciones de wsgi son bastante frágiles si quieres hacer algo no trivial (como los tiempos de muptiple de datos de publicaciones) …