2009-11-23 2 views

Antwort

7

Werfen Sie einen Blick auf WebOb Paket. Es bietet Funktionen, mit denen man bestimmen kann, dass wsgi.input suchbar gemacht werden soll. Dadurch können Sie den Eingabestream zurückspulen, sodass der Inhalt über einen anderen Handler wiedergegeben werden kann. Selbst wenn Sie WebOb nicht verwenden, sollte die Art und Weise, wie es das tut, lehrreich sein, als würde ich Ian vertrauen, dies in einer angemessenen Weise getan zu haben. Für Suchergebnisse in der Dokumentation gehen Sie here.

1

Wenn du wirst es auf einen Schlag lesen, können Sie immer es lesen, erstellen Sie eine cStringIO Datei-ähnliches Objekt von dem was du gelesen hast und es dann zurück zuweisen, wie folgt aus:

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)) 

Es ist höchstwahrscheinlich ein effizienter Weg, dies zu tun, aber ich im allgemeinen Post Zeug Fund wsgi ziemlich spröde, wenn Sie etwas nicht-trivial tun wollen (wie Post-Daten muptiple mal gelesen) ...

+0

Und, Bobince _ist_ der effizientere Weg, das zu tun :) –

+0

Mit einer for/in-Schleife auf wsgi.input wie das könnte sehr Speicher/Zeit ineffizient sein. Wenn Sie im schlimmsten Fall eine große Datei haben, in der alle Daten aus leeren Zeilen bestehen, erstellen Sie am Ende eine sehr große Liste, in der jeder Eintrag ein einzelnes Zeichen ist. Auch nicht sicher, warum Sie sich mit copy.copy() belästigen, wenn Sie es sowieso sofort wieder zusammenfügen. –

10

Sie könnten Versuchen Sie, ein dateiähnliches Replikat des Streams in die Umgebung zurückzusetzen:

from cStringIO import StringIO 

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

Das zu tun ist jedoch ein bisschen ein Geruch. Idealerweise sollte nur ein Codeabschnitt die Abfragezeichenfolge und den Post-Body analysieren und die Ergebnisse an andere Komponenten liefern.

+0

Sie sollten sich nicht darauf verlassen können, dass die Inhaltslänge auf -1 festgelegt werden kann. In der WSGI-Spezifikation gibt es nichts, was besagt, dass eine Implementierung -1 als Argument akzeptieren sollte, damit read() alle Eingaben lesen kann. Eine Implementierung kann unter diesen Umständen eine Ausnahme aussprechen. Tatsächlich sagt die Spezifikation wahrscheinlich sogar, dass, wenn CONTENT_LENGTH nicht vorhanden oder leer ist, diese interpretiert werden muss, um "0" zu bedeuten, oder nicht verfügbar ist. –

+0

Ah yeh ... nicht ganz sicher, warum ich das gesagt habe, mein eigener Code verwendet 0 :-) Es ist deine Absicht, dieses Verhalten in WSGI zu ändern, oder? – bobince

+0

Ich bezweifle, dass WSGI jetzt Änderungen sehen wird. –

Verwandte Themen