Usiłuję zbudować prosty interfejs API za pomocą Flask, w którym chcę teraz przeczytać trochę POSTed JSON. Wykonuję POST z rozszerzeniem Postman Chrome, a JSON I POST jest po prostu {"text":"lalala"}
. Próbuję odczytać JSON przy użyciu następującej metody:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content
return uuid
W przeglądarce poprawnie zwraca UUID, który umieściłem w GET, ale na konsoli po prostu drukuje None
(tam, gdzie spodziewam się, że wydrukuje {"text":"lalala"}
. Czy ktoś wie, jak mogę uzyskać wysłany JSON z metody Flask?
Dla porównania, oto pełny kod wysyłania jsona z klienta Python:
Wejście „json =” automatycznie ustawi typ zawartości, jak omówiono tutaj: Opublikuj JSON za pomocą Pythona
Powyższy klient będzie działał z tym kodem po stronie serwera:
źródło
Tak właśnie bym to zrobił i tak powinno być
Po
silent=True
ustawieniuget_json
funkcja nie powiedzie się podczas próby pobrania treści JSON. Domyślnie jest to ustawione naFalse
. Jeśli zawsze oczekujesz ciała JSON (nie opcjonalnie), pozostaw to jakosilent=False
.Ustawienie
force=True
zignorujerequest.headers.get('Content-Type') == 'application/json'
sprawdzenie, które wykonuje dla ciebie kolba. Domyślnie jest to również ustawione naFalse
.Zobacz dokumentację kolby .
Zdecydowanie polecam odejście
force=False
i sprawienie, by klient wysłałContent-Type
nagłówek, aby był bardziej wyraźny.Mam nadzieję że to pomoże!
źródło
silent=True
. Tak, jest to możliwe i ja z niego korzystam. Jest naprawdę oparty na sposobie projektowania interfejsu API do wykorzystania. Jeśli nie ma takiego przypadku dla twojego punktu końcowego, po prostu usuń gosilent=True
lub jawnie ustaw naFalse
.print(content)
pocontent = request.get_json()
drukuje obiekt ... ale jako prawidłowy obiekt Python (a nie jako prawidłowy obiekt JSON). Na przykład używa pojedynczych cudzysłowów, podczas gdy JSON ściśle wymaga podwójnych cudzysłowów dla obu kluczowych wartości (ciągów) jako wartości ciągów. Jeśli chcesz reprezentację JSON, użyjjson.dumps()
z tym obiektem.Zakładając, że opublikowałeś prawidłowy JSON z
application/json
typem treści,request.json
będzie miał przeanalizowane dane JSON.źródło
response = request.post('http://127.0.0.1:5000/hello', json={"foo": "bar"})
. Po tym uruchomieniuresponse.json()
powinien wrócić{'foo': 'bar'}
{'foo': 'bar'}
nie jest to prawidłowy JSON. Może to być poprawna reprezentacja obiektu w języku Python, która wygląda bardzo podobnie do JSON, ale poprawny JSON ściśle wykorzystuje podwójne cudzysłowy.get_json()
metoda żądania dekoduje z JSON do obiektów Python, tak. Gdzie spodziewasz się, że wygeneruje ważny dokument JSON?.json()
lub.get_json()
zwróci prawidłową reprezentację obiektu JSON, a nie dyktę Pythona. Patrzę tylko na nazwę i wywnioskuję, co może z niej wyniknąć.Dla wszystkich, których problem dotyczył wywołania ajax, oto pełny przykład:
Wywołanie Ajax: kluczem jest użycie a,
dict
a następnieJSON.stringify
A po stronie serwera:
źródło
Podać inne podejście.
źródło
Zakładając, że opublikowałeś prawidłowy JSON,
źródło
Spróbuj użyć parametru siły ...
request.get_json(force = True)
źródło