وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

روش دریافت و تجزیه متن HTTP POST در Flask – JSON و داده های فرم

0 28
زمان لازم برای مطالعه: 5 دقیقه


معرفی

Flask یک میکرو فریمورک عالی برای توسعه وب در پایتون است و به شما امکان می دهد بسیار کم کار کنید. یک REST API فعال را می توان در آن ارائه کرد ثانیه از طریق چند خط کد:

from flask import Flask, request
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello!'

if __name__ == "__main__":
    app.run()

ستون فقرات وب مدرن پروتکل HTTP است – که درخواست ها را ارسال می کند و پاسخ ها را پس می دهد. برای متمایز کردن مقاصد پشت این درخواست ها، چندین مورد “افعال” با وظایفی که انجام می دهید مرتبط بوده است. GET از افعال برای حاشیه نویسی درخواست هایی استفاده می شود که می خواهید منابع را در آنها بازیابی کنید. POST از افعال برای درخواست ایجاد منابع با توجه به بار (بدنه) استفاده می شود. DELETE از افعال برای درخواست حذف منابع و غیره استفاده می شود.

اگر می خواهید یک منبع ایجاد کنید روی یک سرور – شما یک را ارسال خواهید کرد درخواست ارسال با یک بدن که حاوی داده هایی است که شما هستید ارسال کردن به سرور

در این راهنما، ما نگاهی به روش دریافت HTTP POST Body در Flask خواهیم داشت.

به طور کلی، به احتمال زیاد داده‌های JSON را به یک API REST که آن داده‌ها را مصرف می‌کند، پست می‌کنید، یا داده‌های فرم را پست می‌کنید – با پر کردن یک فرم وب و سپس ارسال آن داده‌ها به API دیگر برای پردازش. .

هنگام ارسال داده های فرم – معمولاً به صورت کدگذاری می شوند multipart/form-data، در حالی که هنگام ارسال داده های JSON – معمولاً به صورت کدگذاری می شود application/json. این اطلاعات در سربرگ درخواست POST که می توانید آن را نیز بررسی کنید. برای اندازه گیری خوب – ما خواهیم بود چک کردن هدرهای درخواست قبل از تجزیه داده ها.

هنگام رسیدگی به درخواست ها – request ماژول از flask به شما امکان می دهد درخواست های HTTP ورودی را نشان دهید. آ پست بدن درخواست را می توان به طور مستقیم از خود درخواست استخراج کرد و بسته به آن روی رمزگذاری – به فیلد مناسب دسترسی خواهید داشت:

  • request.json یا request.get_json()
  • request.form
  • request.data

request.json نشان دهنده JSON است که به عنوان یک درخواست با application/json نوع محتوا. به طور متناوب، می توانید از request.get_json() روش. هم دسترسی به خود فیلد و هم متد a را برمی گرداند dict – با key-value جفت های موجود در JSON ورودی.

توجه داشته باشید: این json میدان و get_json() روش ها تنها در صورتی کار خواهند کرد که نوع محتوا از درخواست POST تنظیم شده است application/json. اگر رشته ای با فرمت JSON باشد – این رویکرد با شکست مواجه می شود و منجر به a None ارزش. اگر نمی توانید مشتری را مجبور کنید که داده های رمزگذاری شده را به درستی ارسال کند – می توانید تبدیل رشته ورودی به JSON. بعداً در راهنما پوشش داده شد.

request.form نشان دهنده multipart/form-data داده هایی که از طریق فرم های وب به دست می آیند.

request.data هست یک نمایش رشته از داده های دریافتی به طور کلی – اگر نتوانید مشتری را مجبور کنید محتوای مورد نظر خود را ارسال کند، از این نمایش برای تبدیل به JSON استفاده خواهید کرد.

POST JSON را دریافت کنید

بیایید با JSON شروع کنیم – زیرا این فرمت رایج‌ترین فرمت برای انتقال داده بین APIها است. ما یک router handler ساده ایجاد می کنیم که a را دریافت می کند POST درخواست، روی را /post_json نقطه پایانی یادت باشد json فیلد فقط زمانی حاوی یک مقدار خواهد بود که سرصفحه های درخواست به درستی بدنه را به عنوان an حاشیه نویسی کنند application/json ظرفیت ترابری.

در اینجا، ما نیز دریافت می کنیم ‘نوع محتوا’ از headers و بررسی کنید که آیا بدن واقعاً وجود دارد یا خیر application/json قالب بندی شده است. اگر نه – ما حتی سعی نمی کنیم JSON را از درخواست استخراج کنیم (این کار انجام می شود بی صدا اگر این کار را انجام دهیم شکست می خوریم) و یک پیغام خطا برگردانده می شود:

from flask import Flask, request

@app.route('/post_json', methods=('POST'))
def process_json():
    content_type = request.headers.get('Content-Type')
    if (content_type == 'application/json'):
        json = request.json
        return json
    else:
        return 'Content-Type not supported!'

اگر اکنون یک درخواست POST به نقطه پایانی خود ارسال کنید – با JSON برگردانده می شود:

$ curl -X POST -H "Content-type: application/json" -d "{\"firstName\" : \"John\", \"lastName\" : \"Smith\"}" "localhost:5000/post_json"

توجه داشته باشید: بسته به روی سیستم عامل و پوسته ای که استفاده می کنید – ممکن است استفاده کنید ' بجای " یا حتی از شخصیت های فرار مانند \ در مجموع

این منجر به:

{"firstName":"John","lastName":"Smith"}

عالی! بیایید سعی کنیم تنظیم کنیم -H آرگومان به نوع دیگری – برای بررسی اینکه آیا مرحله اعتبارسنجی به خوبی کار می کند:

$ curl -X POST -H "Content-type: multipart/form-data" -d "{\"firstName\" : \"John\", \"lastName\" : \"Smith\"}" "localhost:5000/post_json"

این منجر به:

Content-Type not supported!

متناوبا، از سوی دیگر، get_json() تقریباً به همین ترتیب کار می کند:

from flask import Flask, request

@app.route('/post_json', methods=('POST'))
def process_json():
    content_type = request.headers.get('Content-Type')
    if (content_type == 'application/json'):
        json = request.get_json()
        return json
    else:
        return 'Content-Type not supported!'

POST JSON را از String دریافت کنید

ما کسانی بودیم که درخواست را تا کنون ارسال کرده‌ایم – بنابراین ما این اختیار را داشتیم که نوع محتوا را به دلخواه خود تغییر دهیم. ممکن است همیشه اینطور نباشد – و گاهی اوقات، می‌توانید با درخواستی با فرمت JSON مواجه شوید که نوع محتوای صحیحی به آن اختصاص داده نشده است.

در این مورد – json و get_json() به هیچ وجه بدنه ورودی را به عنوان JSON تجزیه نکنید – و در نهایت تبدیل خواهید شد None، که نمی توانید چیزی از آن استخراج کنید. در چنین مواردی – می توانید از json ماژول به بار رشته ای که در یک فرهنگ لغت دریافت کرده اید (key-value جفت)!

اجازه دهید import ماژول و تبدیل ورودی request.data:

from flask import Flask, request, json

@app.route('/post_json', methods=('POST'))
def process_json():
    data = json.loads(request.data)
    return data

در حال حاضر – آیا شما ارسال یک text/plain-بدنه کدگذاری شده یا an application/jsonبدنه کدگذاری شده – the json ماژول می تواند ورودی را اداره کند. اگر سعی کنیم یکی از این درخواست ها را ارسال کنیم – هر دو به یک پاسخ منجر می شوند:

$ curl -X POST -H "Content-type: application/json" -d "{\"firstName\" : \"John\", \"lastName\" : \"Smith\"}" "localhost:5000/post_json"
$ curl -X POST -H "Content-type: text/plain" -d "{\"firstName\" : \"John\", \"lastName\" : \"Smith\"}" "localhost:5000/post_json"

آنها منجر به:

{"firstName":"John","lastName":"Smith"}

دریافت فرم پست

هنگام پر کردن فرم ها – یک سری ورودی و برچسب های مربوط به آنها دارید. زیر کاپوت – اینها همه فقط هستند key-value جفت:

username=user_input
password=user_input_2
...

این معمولاً از front-end مشتق شده است – معمولاً یک HTML page با یک <form> با چند تگ کنید <input> زمینه های درون آن همچنین می توانید داده های فرم را از طریق ارسال کنید curl مانند:

$ curl -X POST -H "Content-type: multipart/form-data"  -F "username=john" -F "password=doe" "localhost:5000/post_form"

یا می توانید تمام فیلدها را در یک آرگومان جمع کنید:

$ curl -X POST -H "Content-type: multipart/form-data"  -F "username=john&password=doe" "localhost:5000/post_form"

به طور کلی – شما با فرم های واقعی کار خواهید کرد، و فرمی که ما با آن کار می کنیم به نظر می رسد:

<form action="/post_form" enctype="multipart/form-data" method="POST"> 
    <input type="text" name="username">
    <input type="password" name="password">
</form>

این name از هر <input> به عنوان نقشه برداری شده است key به یک value ورودی توسط کاربر این form استخراج شده از request شیء دیگری است dict – و می توانید به راحتی به فیلدها به صورت جداگانه دسترسی داشته باشید:

from flask import Flask, request

@app.route('/post_form', methods=('POST'))
def process_form():
    data = request.form
    print(data('username'))
    print(data('password'))    
    return data

وقتی درخواستی را از طریق console – فرهنگ لغت حاوی جفت های کلید-مقدار برگردانده می شود (که سپس دوباره به صورت JSON قالب بندی می شود):

{"password":"doe","username":"john"}

و روی سرور پایان – ورودی های این دو فیلد درست در زیر گزارش درخواست ورودی چاپ شده است.

127.0.0.1 - - (09/Dec/2021 00:24:32) "POST /post_form HTTP/1.1" 200 -
john
doe

به طور طبیعی، به جای چاپ مقادیر فقط در console – داده ها را اعتبارسنجی می کنید، یک کاربر ایجاد می کنید و آنها را در پایگاه داده نگهداری می کنید. همچنین، می‌توانید فیلدهای هر کلاس را از این طریق پر کنید، قبل از اینکه از آن کلاس برای هدف خود استفاده کنید.

نتیجه

در این راهنما، نگاهی به روش رسیدگی به درخواست‌های HTTP POST دریافتی در Flask انداخته‌ایم. ما داده‌های JSON ورودی و همچنین روش مدیریت JSON ارائه‌شده با رشته را که به‌طور خودکار دریافت نمی‌شوند پوشش داده‌ایم.

در نهایت، ما داده های فرم را پوشش داده ایم.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-07 18:02:02

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید