از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
نحوه ارسال “چند بخشی/فرم-داده” با درخواست در پایتون
سرفصلهای مطلب
معرفی
اگر تا به حال نیاز به ارسال فایل ها یا داده ها به سرور از طریق درخواست POST داشته اید، احتمالاً مجبور به استفاده از multipart/form-data
. در این بایت، نحوه ارسال این درخواست ها را با استفاده از requests
کتابخانه در پایتون
“چند بخشی/فرم-داده” چیست؟
multipart/form-data
یک نوع رسانه است که به شما امکان می دهد داده های باینری یا متنی را در بخش هایی در یک درخواست ارسال کنید. اغلب برای مواردی مانند آپلود فایل ها در سرور استفاده می شود. به عنوان مثال، هنگامی که یک عکس نمایه یا یک سند را در یک وب سایت آپلود می کنید، داده ها اغلب به عنوان ارسال می شوند multipart/form-data
.
مزیت اصلی از multipart/form-data
توانایی آن در بستهبندی چندین بخش، هر کدام با انواع دادههای بالقوه متفاوت، در یک درخواست HTTP است. این بسیار کارآمد است و می تواند پهنای باند زیادی را ذخیره کند.
نحوه ارسال چندبخشی/فرم-داده با درخواست
وقتی صحبت از درخواستهای HTTP در پایتون میشود، کتابخانه Requests یک ابزار کاربردی است. سادگی و عملکرد آن باعث محبوبیت آن در بین توسعه دهندگان پایتون شده است. بیایید ببینیم چگونه می توانیم از آن برای ارسال استفاده کنیم multipart/form-data
.
تنظیم محیط خود
قبل از شروع، مطمئن شوید که کتابخانه Requests را نصب کرده اید. اگر نه، می توانید آن را با استفاده از pip به محیط پایتون خود اضافه کنید:
$ pip install requests
کد
فرض کنید باید یک عکس نمایه را در یک سرور آپلود کنیم. در اینجا یک اسکریپت ساده است که این کار را انجام می دهد:
import requests
url = "http://example.com/upload"
file_path = "/path/to/your/file.jpg"
with open(file_path, "rb") as file:
files = {'file': file}
response = requests.post(url, files=files)
print(response.status_code)
در این اسکریپت، ابتدا آن را وارد می کنیم requests
کتابخانه سپس ما را تعریف می کنیم url
جایی که میخواهیم فایل و file_path
جایی که فایل ما به صورت محلی قرار دارد.
ما فایل را در حالت باینری باز می کنیم ('rb'
) که به ما امکان می دهد فایل های غیر متنی مانند تصاویر را بخوانیم. سپس یک فرهنگ لغت ایجاد می کنیم files
که در آن کلید رشته است 'file'
و مقدار شی فایل است.
در نهایت با استفاده از یک درخواست POST به سرور ارسال می کنیم requests.post(url, files=files)
. را files
پارامتر در requests.post
از تنظیم مراقبت می کند Content-Type
سربرگ به multipart/form-data
.
پس از اجرای اسکریپت، کد وضعیت پاسخ را چاپ می کند. کد وضعیت 200
یعنی درخواست موفقیت آمیز بود
توجه داشته باشید: حتما تعویض کنید 'http://example.com/upload'
با URL واقعی که می خواهید فایل را به آن ارسال کنید، و '/path/to/your/file.jpg'
با مسیر واقعی فایلی که می خواهید قبل از اجرای این کد آپلود کنید.
رسیدگی به خطاهای احتمالی
هنگام کار با multipart/form-data
و پایتون requests
، چند خطای بالقوه وجود دارد که باید آن ها را بررسی و رسیدگی کنید. پایتون try-except
بلاک کردن بهترین راه برای رسیدگی به این خطاها است.
کد زیر را در نظر بگیرید:
import requests
url = "http://example.com/upload"
file_path = "/path/to/your/file"
try:
with open(file_path, "rb") as f:
r = requests.post(url, files={'file': f})
except FileNotFoundError:
print("The file was not found.")
except requests.exceptions.RequestException as e:
print("There was an exception that occurred while handling your request.", e)
این کد سعی می کند یک فایل را باز کند و آن را به عنوان بخشی از a ارسال کند multipart/form-data
درخواست. اگر فایل وجود نداشته باشد، الف FileNotFoundError
مطرح خواهد شد. اگر requests
نمی تواند وصل شود، یک را افزایش می دهد ConnectionError
. همه requests
استثناها از ارث می برند RequestException
، بنابراین در کد ما همه آن خطاها را فقط با یک خط می گیریم.
خطاهای رایج و راه حل ها
چند خطای دیگر هنگام ارسال وجود دارد multipart/form-data
نسبت به آنچه در بالا به آن اشاره کردیم. بیایید نگاهی به چند مورد از آنها بیندازیم:
-
requests.exceptions.TooManyRedirects: این زمانی اتفاق میافتد که نشانی اینترنتی که به آن اشاره میکنید مدام ریدایرکتها را برمیگرداند. به عنوان مثال، اگر دو URL به یکدیگر هدایت شوند، در یک حلقه بی نهایت گیر خواهید کرد. اگر
requests
این را تشخیص می دهد، این استثنا را ایجاد می کند. -
requests.exceptions.MissingSchema: این زمانی اتفاق می افتد که فراموش می کنید پروتکل را اضافه کنید (
http://
یاhttps://
) در URL شما. اطمینان حاصل کنید که URL شما شامل پروتکل است. -
requests.exceptions.ConnectionError: این خطا زمانی ایجاد می شود که شما قادر به اتصال به سرور نباشید. ممکن است به دلیل آدرس اینترنتی اشتباه، مشکلات شبکه، یا ممکن است سرور از کار افتاده باشد.
-
درخواستها.استثناها.تایم اوت: این خطا زمانی ایجاد می شود که یک درخواست به پایان برسد. شما می توانید با افزایش زمان یا تنظیم آن بر روی هیچ (که به این معنی است که درخواست به طور نامحدود منتظر می ماند) این کار را انجام دهید.
روش های جایگزین
یک جایگزین برای ارسال الف multipart/form-data
درخواست استفاده از http.client
کتابخانه، که یک کلاینت پروتکل HTTP سطح پایین است. استفاده از آن کمی پیچیدهتر است، اما به شما کنترل بیشتری بر درخواستهایتان میدهد و به کتابخانه شخص ثالث نیاز ندارد.
در اینجا مثالی از نحوه ارسال شما آورده شده است multipart/form-data
استفاده کردن http.client
:
import http.client
import os
import uuid
file_path = "/path/to/your/file.jpg"
with open(file_path, "rb") as f:
file_content = f.read()
boundary = str(uuid.uuid4())
headers = {
'Content-Type': f"multipart/form-data; boundary={boundary}",
}
conn = http.client.HTTPConnection("example.com", 8000)
payload = (
f"--{boundary}\r\n"
f"Content-Disposition: form-data; name=\"file\"; filename=\"file.jpg\"\r\n"
"Content-Type: text/plain\r\n"
"\r\n"
f"{file_content.decode('utf-8')}\r\n"
f"--{boundary}--\r\n"
)
conn.request("POST", "/upload", body=payload, headers=headers)
response = conn.getresponse()
data = response.read()
conn.close()
print(response.status, response.reason)
print(data.decode("utf-8"))
این کد یک اتصال HTTPS به “example.com” ایجاد می کند، یک درخواست POST با فایل ما به عنوان ارسال می کند. multipart/form-data
و سپس پاسخ را از سرور چاپ می کند.
نتیجه
در این بایت، نحوه ارسال را مشاهده کرده اید multipart/form-data
با پایتون requests
کتابخانه، خطاهای بالقوه را مدیریت می کند و همچنین برخی از خطاهای رایج و راه حل های آنها را بررسی می کند. ما همچنین یک روش جایگزین برای ارسال را مورد بحث قرار دادیم multipart/form-data
استفاده کردن http.client
.
منتشر شده در 1402-12-26 20:39:03