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

سرور مجازی NVMe

نحوه ارسال “چند بخشی/فرم-داده” با درخواست در پایتون

0 12
زمان لازم برای مطالعه: 4 دقیقه


معرفی

اگر تا به حال نیاز به ارسال فایل ها یا داده ها به سرور از طریق درخواست 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 نسبت به آنچه در بالا به آن اشاره کردیم. بیایید نگاهی به چند مورد از آنها بیندازیم:

  1. requests.exceptions.TooManyRedirects: این زمانی اتفاق می‌افتد که نشانی اینترنتی که به آن اشاره می‌کنید مدام ریدایرکت‌ها را برمی‌گرداند. به عنوان مثال، اگر دو URL به یکدیگر هدایت شوند، در یک حلقه بی نهایت گیر خواهید کرد. اگر requests این را تشخیص می دهد، این استثنا را ایجاد می کند.

  2. requests.exceptions.MissingSchema: این زمانی اتفاق می افتد که فراموش می کنید پروتکل را اضافه کنید (http:// یا https://) در URL شما. اطمینان حاصل کنید که URL شما شامل پروتکل است.

  3. requests.exceptions.ConnectionError: این خطا زمانی ایجاد می شود که شما قادر به اتصال به سرور نباشید. ممکن است به دلیل آدرس اینترنتی اشتباه، مشکلات شبکه، یا ممکن است سرور از کار افتاده باشد.

  4. درخواستها.استثناها.تایم اوت: این خطا زمانی ایجاد می شود که یک درخواست به پایان برسد. شما می توانید با افزایش زمان یا تنظیم آن بر روی هیچ (که به این معنی است که درخواست به طور نامحدود منتظر می ماند) این کار را انجام دهید.

پیشنهاد می‌کنیم بخوانید:  چگونه پروژه خود را میزبانی کنیم روی GitHub - با مثال توضیح داده شده است

روش های جایگزین

یک جایگزین برای ارسال الف 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

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

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

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