কন্টেন্ট-টাইপ শিরোনাম নির্বিশেষে পাইথন ফ্লাস্কে কাঁচা পোষ্ট বডি পান


131

পূর্বে, আমি জিজ্ঞাসা করেছি যে ফ্ল্যাশ অনুরোধে ডেটা গ্রহণ করা যায় কারণ request.dataখালি ছিল। উত্তরে ব্যাখ্যা করা হয়েছে যে request.dataএটি কাঁচা পোস্ট বডি, তবে ফর্ম ডেটা পার্স করা থাকলে খালি থাকবে। আমি কীভাবে শর্তহীন কাঁচা পোস্ট বডি পেতে পারি?

@app.route('/', methods=['POST'])
def parse_request():
    data = request.data  # empty in some cases
    # always need raw data here, not parsed form data

উত্তর:


218

request.get_data()সামগ্রীর প্রকার নির্বিশেষে কাঁচা ডেটা পেতে ব্যবহার করুন । তথ্য ক্যাশে হয় এবং আপনি পরবর্তীকালে অ্যাক্সেস করা যাবে request.data, request.json, request.formচলবে।

আপনি যদি request.dataপ্রথম অ্যাক্সেস করেন তবে এটি get_dataপ্রথমে ফর্ম ডেটা পার্স করার যুক্তি দিয়ে কল করবে । অনুরোধে কোনো ফর্ম বিষয়বস্তুর প্রকার থাকে ( multipart/form-data, application/x-www-form-urlencoded, অথবা application/x-url-encoded) তাহলে কাঁচা ডেটা ধ্বংস করা হবে না। request.dataএবং request.jsonএই ক্ষেত্রে খালি প্রদর্শিত হবে।


2
এই গোগ্রাসে গেলা-পাইথন (Sentry), বাগ এবং সমাধান নীচে উপস্থিত এখানে ব্যবহার যখন বিরতি বলে মনে হয় github.com/getsentry/raven-python/issues/457
dequis

34

request.streamডাব্লুএসজিআই সার্ভার দ্বারা প্রয়োগ করা কাঁচা ডেটার প্রবাহ। পড়ার সময় কোনও পার্সিং করা হয় না, যদিও আপনি সাধারণত request.get_data()পরিবর্তে চান ।

data = request.stream.read()

স্ট্রিমটি খালি হবে যদি এটি পূর্বে request.dataবা অন্য কোনও গুণাবলী দ্বারা পড়া হয়েছিল ।


15

আমি একটি ডাব্লুএসজিআই মিডলওয়্যার তৈরি করেছি যা environ['wsgi.input']স্ট্রিম থেকে কাঁচা দেহ সঞ্চয় করে । আমি ডাব্লুএসজিআই পরিবেশে মানটি সংরক্ষণ করেছি যাতে আমি এটি থেকে অ্যাক্সেস করতে পারিrequest.environ['body_copy'] আমার অ্যাপ্লিকেশন পারি।

ওয়ার্কজেগ বা ফ্লাস্কে এটি প্রয়োজনীয় নয়, যেমন request.get_data()সামগ্রীর প্রকার নির্বিশেষে কাঁচা ডেটা পাবেন তবে এইচটিটিপি এবং ডাব্লুএসজিআই আচরণের আরও ভাল পরিচালনা করার সাথে।

এটি পুরো শরীরকে মেমরির মধ্যে পড়ে, যা উদাহরণস্বরূপ একটি বড় ফাইল পোস্ট করা হলে এটি একটি সমস্যা হবে। Content-Lengthশিরোনাম অনুপস্থিত থাকলে এটি কিছু পড়বে না , সুতরাং এটি স্ট্রিমিংয়ের অনুরোধগুলি পরিচালনা করবে না।

from io import BytesIO

class WSGICopyBody(object):
    def __init__(self, application):
        self.application = application

    def __call__(self, environ, start_response):
        length = int(environ.get('CONTENT_LENGTH') or 0)
        body = environ['wsgi.input'].read(length)
        environ['body_copy'] = body
        # replace the stream since it was exhausted by read()
        environ['wsgi.input'] = BytesIO(body)
        return self.application(environ, start_response)

app.wsgi_app = WSGICopyBody(app.wsgi_app)
request.environ['body_copy']

6

request.datarequest.headers["Content-Type"]ফর্ম ডেটা হিসাবে স্বীকৃত হলে খালি হবে , যা পার্স করা হবে request.form। সামগ্রীর প্রকার নির্বিশেষে কাঁচা ডেটা পেতে, ব্যবহার করুন request.get_data()

request.dataকলগুলি request.get_data(parse_form_data=True), যা ফর্ম ডেটার জন্য পৃথক আচরণের ফলাফল করে।

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