ইউনিট পরীক্ষায় জেএসএনগুলির সাথে কীভাবে অনুরোধগুলি প্রেরণ করা যায়


100

আমার কাছে ফ্লাস্ক অ্যাপ্লিকেশনটির মধ্যে কোড রয়েছে যা অনুরোধে জেএসএন ব্যবহার করে এবং আমি জেএসওএন অবজেক্টটি এর মতো পেতে পারি:

Request = request.get_json()

এটি ঠিকঠাকভাবে কাজ করছে, তবে আমি পাইথনের ইউনিটেস্ট মডিউলটি ব্যবহার করে ইউনিট পরীক্ষাগুলি তৈরি করার চেষ্টা করছি এবং অনুরোধের সাথে জেএসএন পাঠানোর কোনও উপায় খুঁজে পেতে আমার অসুবিধা হচ্ছে।

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

এটি আমাকে দেয়:

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

ফ্লাস্কের একটি জেএসএন আর্গুমেন্ট রয়েছে বলে মনে হচ্ছে যেখানে আপনি পোস্ট অনুরোধের মধ্যে জসন = ডিক (foo = 'বার') সেট করতে পারেন তবে ইউনিটেস্ট মডিউলটি দিয়ে কীভাবে তা করবেন তা আমি জানি না।


কি request.dataরয়েছে? প্রায়শই যখন জাসন পার্সিং ভুল ইনপুট কারণে ব্যর্থ হয়, এটি নিঃশব্দে ব্যর্থ Noneহয় এবং ফিরে আসে যাতে কাঁচা ইনপুট ডেটা জসন নাও হতে পারে।
বানোয়েট ল্যাটিনিয়র

>>> request.get_data () 'f "foo": "bar"}' >>> অনুরোধ.get_json () কিছুই নেই আমি ফ্লাস্কের অনুরোধটি কীভাবে কাজ করে তা পুরোপুরি নিশ্চিত নই, তবে এটি ডেটা এবং জেসনকে পৃথক করে বলে মনে হচ্ছে, এবং আমি কীভাবে ডেটা চেয়ে জসনকে তথ্য প্রেরণ করা যায় তা যদি বুঝতে পারি না, যদি এটি কোনও ধারণা দেয়।
সেপ্টেম্বর নাজারি

9
আমি মনে করি এটি সামগ্রীর ধরণের শিরোনাম, এগুলি প্রশংসন / জেসসনে সেট করার চেষ্টা করুন। ফোর্স প্যারামিটারটিও সহায়ক তবে আপনি সম্ভবত ইউনিটেটস পাস করতে, মাইম পরিবর্তন করার জন্য আরও ভাল করতে চান না
ব্যবহারকারী 3012759

উত্তর:


199

পোস্টটি পরিবর্তন করা হচ্ছে

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

ঠিক কর.

ব্যবহারকারী 3012759 ধন্যবাদ।


এই সাথে আমার মাথা নষ্ট করছিল। আপনি ইতিমধ্যে application/jsonসামগ্রীর ধরণ উল্লেখ করার সময় আপনাকে কেন ডেটা ফেলতে হবে তা বুঝতে পারছেন না ।
ডিএমএমজি

আমি বিশ্বাস করি এটি কারণ আপনি পোস্টে যা কিছু পাঠান তা স্ট্রিং হওয়া উচিত।
নাজারি

18
আশ্চর্যজনকভাবে এটি ডক্সগুলিতে নেই, কারণ ফ্লাস্কের টেস্ট_ক্লিয়েন্টের কোনও এপিআই ডক্স নেই!
rjurney

প্রতিক্রিয়া থেকে কীভাবে ডেটা পাবেন?
পরিবর্তনশীল

@ পরিবর্তনশীল, post যেমন একটি অনুরোধের প্রতিক্রিয়া সহ resp = client.post('/my/endpoint/',json=my_json_data)আপনি বাইট হিসাবে ডেটা অ্যাক্সেস করতে পারেন resp.data
amiabl

44

আপডেট: যেহেতু ফ্লাস্ক ১.০ প্রকাশিত 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

4
এবং ভুলে যাবেন না যে জসন যুক্তিটি অবশ্যই dictজেএসএন স্ট্রিং নয়!
লন্ড্রোম্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.