از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش دریافت و تجزیه متن HTTP POST در Flask – JSON و داده های فرم
سرفصلهای مطلب
معرفی
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