Mam kod w aplikacji Flask, która używa JSON w żądaniu i mogę pobrać obiekt JSON w następujący sposób:
Request = request.get_json()
To działa dobrze, jednak próbuję tworzyć testy jednostkowe za pomocą modułu unittest Pythona i mam trudności ze znalezieniem sposobu na wysłanie JSON z żądaniem.
response=self.app.post('/test_function',
data=json.dumps(dict(foo = 'bar')))
To daje mi:
>>> request.get_data()
'{"foo": "bar"}'
>>> request.get_json()
None
Wydaje się, że Flask ma argument JSON, w którym można ustawić json = dict (foo = 'bar') w żądaniu postu, ale nie wiem, jak to zrobić z modułem unittest.
python
json
flask
python-unittest
Sepehr Nazari
źródło
źródło
request.data
zawiera? Często, gdy parsowanie json kończy się niepowodzeniem z powodu nieprawidłowych danych wejściowych, kończy się niepowodzeniem i zwraca,None
więc nieprzetworzone dane wejściowe mogą nie być json.Odpowiedzi:
Zmiana posta na
response=self.app.post('/test_function', data=json.dumps(dict(foo='bar')), content_type='application/json')
naprawione.
Dzięki user3012759.
źródło
application/json
typ zawartości.post
żądania, taką jakresp = client.post('/my/endpoint/',json=my_json_data)
dostęp do danych w bajtach zresp.data
.AKTUALIZACJA: Ponieważ
flask.testing.FlaskClient
metody wydane w Flask 1.0 akceptująjson
argument iResponse.get_json
dodaną metodę, zobacz przykład .dla Flask 0.x możesz skorzystać z poniższego paragonu:
from flask import Flask, Response as BaseResponse, json from flask.testing import FlaskClient from werkzeug.utils import cached_property class Response(BaseResponse): @cached_property def json(self): return json.loads(self.data) class TestClient(FlaskClient): def open(self, *args, **kwargs): if 'json' in kwargs: kwargs['data'] = json.dumps(kwargs.pop('json')) kwargs['content_type'] = 'application/json' return super(TestClient, self).open(*args, **kwargs) app = Flask(__name__) app.response_class = Response app.test_client_class = TestClient app.testing = True
źródło
dict
łańcuchem JSON!