2013-07-14 6 views
5

Okazuje się, że Flask ustawia request.data na pusty ciąg znaków, jeśli typ treści żądania jest application/x-www-form-urlencoded. Ponieważ używam żądania ciała JSON, po prostu chcę przeanalizować json lub wymusić Flask, aby je przeanalizować i zwrócić request.json.Kolba - Jak odczytać surową treść w żądaniu POST, gdy typem treści jest "application/x-www-form-urlencoded"

Jest to potrzebne, ponieważ zmiana typu zawartości AJAX wymusza żądanie HTTP OPTION, co komplikuje back-end.

Jak sprawić, aby Flask zwrócił nieprzetworzone dane w obiekcie żądania?

Odpowiedz

7

Możesz uzyskać dane pocztowe za pośrednictwem request.form.keys()[0], jeśli typem treści jest application/x-www-form-urlencoded.

to multidict, którego klucze zawierają przeanalizowane dane postów.

+0

Wygląda na to, że był to również sposób na pobranie danych z naszego posta do butelki. Wystarczy zmienić request.form.keys() [0] na 'list (request.forms.keys()) [0]'. Dzięki za ostateczne rozwiązanie godzin debugowania! –

+0

Dlaczego to działa? Wygląda na to, że powinien to być tylko pierwszy klucz słownika parsowany z ciała, ale w jakiś sposób zwraca całe ciało? – max

+0

Czy ktoś może wyjaśnić, dlaczego dane są umieszczane w formularzach kluczy? –

1

Jeśli chcesz uzyskać JSON, gdy wniosek jest 'Content-Type': 'application/x-www-form-urlencoded' trzeba "siła" konwersja do formatu JSON jak de kodu poniżej:

from flask import Flask, request 


app = Flask(__name__) 


@app.route("/my-endpoint", methods = ['POST']) 
def myEndpoint(): 

    requestJson = request.get_json(force=True) 

    //TODO: do something.... 

    return requestJson 


if __name__ == "__main__": 
    port = int(os.environ.get('PORT', 5000)) 
    app.run(host='0.0.0.0', port=port, debug=True, use_reloader=True) 
1

Użyj request.get_data(), aby uzyskać dane POST. Działa to niezależnie od tego, czy dane mają typ zawartości application/x-www-form-urlencoded lub application/octet-stream.