Werkzeug XML Post request

Django, Flask, Bottle, WSGI, CGI…
Antworten
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Wenn du nicht willst, dass Werkzeug das parst musst du einen anderen content type mitschicken (zb application/xml). Dann landets auch in request.data.
TUFKAB – the user formerly known as blackbird
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Hallo,

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

Frank
Antworten