Seite 1 von 1

Werkzeug XML Post request

Verfasst: Donnerstag 3. Februar 2011, 11:48
von frabron
Hi,

Ich habe hier grade ein Problem mit Werkzeug, bzw. Flask. Ich sende über ein proxy - Skript (in php) Post Daten an eine Flask - Route. Mittels dem Request - Objekt will ich auf die Daten zugreifen, die mittels POST geschickt werden. Dabei ist zu beachten, dass die Daten im POST-Body gesendet werden und nicht, wie üblich als key=value Paare. Ich dachte, eigentlich, die Daten würden im request.data Attribut gespeichert, jedoch erkennt Werkzeug wohl den Content-type und parst den POST Request nach request.form, so dass ich nun ein ImmutableDict erhalte:

Code: Alles auswählen

ImmutableMultiDict([('<wfs:GetFeature xmlns:wfs', u'"http://www.opengis.net/wfs" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.open
gis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><wfs:Query typeName="ms:bahnhof"
xmlns:ms="http://mapserver.gis.umn.edu/mapserver"/></wfs:GetFeature>')])
Wie man schön erkennen kann, ist <wfs:GetFeature xmlns:wfs' nun der key im ImmutableMultiDict, was imho ziemlich unsinnig ist.
Langer Rede kurze Frage: Kann ich das Parsen der POST Daten irgendwie verhindern, so dass ich mittels request.data auf den POST Body zugreifen kann?

Relevanter Teil aus dem PHP Proxy-Skript:
php hat geschrieben: $ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
curl_setopt($ch, CURLOPT_POST, True);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$response = curl_exec($ch);
curl_close($ch);
Der Teil aus der Flask Route:

Code: Alles auswählen

def dispatch_request(ows_request, ows_map):
    if request.method == 'POST':
        postrequest = ''
        logging.debug("FORM")
        logging.debug(request.form)
        # leer:
        logging.debug("DATA")
        logging.debug(request.data)

        try:
            for line in request.data:
                postrequest += line
                
            ows_request.postrequest = postrequest

Re: Werkzeug XML Post request

Verfasst: Donnerstag 3. Februar 2011, 11:58
von DasIch
Es gibt ein ganzes Dokument in der Werkzeug Dokumentation dazu, dies solltest du dir anschauen. Genauso wie den `shallow` keyword parameter des Request objekts, welches dafür sorgt dass Werkzeug das WSGI Environment nicht verändert, also auch den stream nicht einliest.

Re: Werkzeug XML Post request

Verfasst: Donnerstag 3. Februar 2011, 13:54
von frabron
Prima, danke, dass hilft mir weiter. Ich bin mir nach dem Studium immer noch nicht sicher, warum meine Daten in request.form landen, denn laut Doku und den dort beschriebenen Vorraussetzungen sollten sie nicht. Aber ich konnte mein Problem soweit erst einmal lösen. Beizeiten werde ich das mal genauer austesten.
Beim Browsen durch den Quellcode des BaseRequest Objekts scheint mir auch der content-type, der dem POST mitgeschickt wird, weniger Bedeutung beigemessen zu werden, als die Doku vermuten lässt. Aber das schaue ich mir mal in Ruhe an ...

Frank

Re: Werkzeug XML Post request

Verfasst: Mittwoch 9. Februar 2011, 16:11
von mitsuhiko
Wenn du nicht willst, dass Werkzeug das parst musst du einen anderen content type mitschicken (zb application/xml). Dann landets auch in request.data.

Re: Werkzeug XML Post request

Verfasst: Mittwoch 9. Februar 2011, 16:25
von frabron
Hallo,

danke für den Tipp. Mal sehen, wie ich das am besten Umsetze ...

Frank