यूनिट परीक्षणों में JSONs के साथ अनुरोध कैसे भेजें


96

मेरे पास एक फ्लास्क एप्लिकेशन के भीतर कोड है जो अनुरोध में JSON का उपयोग करता है, और मुझे JSON ऑब्जेक्ट मिल सकता है:

Request = request.get_json()

यह ठीक काम कर रहा है, हालांकि मैं पायथन के सबसे अच्छे मॉड्यूल का उपयोग करके यूनिट परीक्षण बनाने की कोशिश कर रहा हूं और मुझे अनुरोध के साथ JSON भेजने का रास्ता खोजने में कठिनाई हो रही है।

response=self.app.post('/test_function', 
                       data=json.dumps(dict(foo = 'bar')))

यह मुझे देता है:

>>> request.get_data()
'{"foo": "bar"}'
>>> request.get_json()
None

फ्लास्क में JSON तर्क होता है जहां आप पोस्ट अनुरोध के भीतर json = dict (foo = 'bar') सेट कर सकते हैं, लेकिन मुझे नहीं पता कि यह कैसे करना है।


क्या request.dataशामिल है? अक्सर जब गलत इनपुट के कारण json पार्सिंग विफल हो जाता है, तो यह चुपचाप विफल हो जाता है और Noneइस तरह से कच्चे इनपुट डेटा को वापस नहीं किया जा सकता है।
बेनोइट लेटिनियर

>>> request.get_data () '{"foo": "बार"} >>> request.get_json () कोई भी मुझे पूरा यकीन नहीं है कि फ्लास्क का अनुरोध कैसे काम करता है, लेकिन यह डेटा और जसन को अलग करता है, और मुझे यह पता लगाने के लिए नहीं है कि डेटा के बजाय जोंस को जानकारी कैसे भेजें, अगर इसका कोई मतलब है।
सेफर नाज़री

9
मुझे लगता है कि यह सामग्री प्रकार के शीर्ष लेख हैं, इन्हें प्रशंसा / json के लिए सेट करने का प्रयास करें। फोर्स पैरामीटर भी मददगार है, लेकिन आप शायद वहां नहीं जाना चाहते हैं, सिर्फ
एकटा

जवाबों:


194

पद को बदलना

response=self.app.post('/test_function', 
                       data=json.dumps(dict(foo='bar')),
                       content_type='application/json')

ठीक कर दिया।

उपयोगकर्ता 3012759 के लिए धन्यवाद।


इस के साथ मेरे सिर के चारों ओर wrecking था। यह न समझें कि जब आप पहले से ही application/jsonसामग्री प्रकार निर्दिष्ट कर रहे हैं तो आपको डेटा डंप क्यों करना होगा ।
डिमोग्राम

मेरा मानना ​​है कि यह इसलिए है क्योंकि आप एक पोस्ट में जो कुछ भी भेजते हैं वह एक स्ट्रिंग होना है।
सेफर नाज़री

17
कमाल यह डॉक्स में नहीं है, क्योंकि फ्लास्क के test_client में कोई एपीआई डॉक्स नहीं है!
rjurney

प्रतिक्रिया से डेटा कैसे प्राप्त करें?
चर

@ उपलब्ध, post जैसे अनुरोध से प्रतिक्रिया के साथ resp = client.post('/my/endpoint/',json=my_json_data)आप डेटा को बाइट्स के रूप में एक्सेस कर सकते हैं resp.data
अमीबेल

44

अद्यतन: फ्लास्क 1.0 के बाद से जारी किए गए flask.testing.FlaskClientतरीके jsonतर्क और Response.get_jsonविधि को स्वीकार करते हैं, उदाहरण देखें ।

फ्लास्क 0.x के लिए आप नीचे रसीद का उपयोग कर सकते हैं:

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

1
और यह मत भूलो कि json तर्क dictएक JSON स्ट्रिंग नहीं होना चाहिए !
लॉन्ड्रोमैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.