microdot.multipart --- تحليل multipart/form-data¶
يحلل أجسام الطلبات من نوع Content-Type: multipart/form-data -- وهو الترميز الذي تستخدمه المتصفحات للنماذج التي تتضمن حقول <input type="file">. نكهتان من واجهة API:
FormDataIterتدفقية تُنتج الحقول واحداً تلو الآخر -- مفيدة عندما يتعين على التطبيق معالجة عمليات رفع ضخمة جداً جزءاً جزءاً على جهاز محدود الذاكرة.مزخرف
with_form_data()يخزّن كل شيء مؤقتاً ويملأrequest.form/request.files-- وهو واجهة API الملائمة لعمليات الرفع ذات الحجم العادي.
class FormDataIter¶
- class microdot.multipart.FormDataIter(request)¶
مكرِّر غير متزامن على أجزاء جسم request متعدد الأجزاء. القيم المُنتَجة هي أزواج
(name, value)؛ تكون value من نوعstrللحقول العادية وFileUploadلحقول الملفات.يُستخدم مباشرة عندما تكون الذاكرة أهم من سهولة الاستخدام:
from microdot.multipart import FormDataIter, FileUpload @app.post('/upload') async def upload(request): async for name, value in FormDataIter(request): if isinstance(value, FileUpload): await value.save('/sdcard/' + value.filename) else: print(name, '=', value) return 'ok'
ملاحظة
عند التكرار على حقول الملفات، يجب استهلاك الملف (عبر
FileUpload.read()أوFileUpload.save()) قبل تكرارasync forالتالي -- إذ يصبح التدفق الأساسي غير صالح عند تقدم التكرار.
class FileUpload¶
- class microdot.multipart.FileUpload(filename: str, content_type: str | None, read)¶
ملف واحد مرفوع. تُنتَج النسخ بواسطة
FormDataIterوتُجمَع فيrequest.filesبواسطةwith_form_data(). لا تبني التطبيقات عادةًFileUploadمباشرة.- max_memory_size: int¶
سمة صنف. العتبة (بالبايتات) التي يتحول فوقها
copy()من التخزين المؤقت في الذاكرة إلى ملف مؤقت. الافتراضي 1024.
- async save(path_or_file)¶
حفظ الرفع في path_or_file، الذي يمكن أن يكون مسار نظام ملفات أو كائن ملف مفتوح بالفعل.
- async copy(max_memory_size: int | None = None)¶
تخزين الرفع مؤقتاً (إما في RAM أو في ملف مؤقت، اعتماداً على
max_memory_size) بحيث يمكن تحليل بقية جسم الطلب متعدد الأجزاء دون أن يصبح التدفق الأصلي غير صالح. يستدعي مزخرفwith_form_data()هذا تلقائياً.
- async close()¶
تحرير أي ملف مؤقت أنشأه
copy(). يُستدعى تلقائياً عند انتهاء الطلب إذا وصل الرفع إلىrequest.filesعبرwith_form_data().
مزخرفات على مستوى الوحدة¶
- microdot.multipart.with_form_data(f)¶
مزخرف يحلل الجسم متعدد الأجزاء مسبقاً ويملأ
request.formوrequest.filesقبل تشغيل المعالج:from microdot import Microdot from microdot.multipart import with_form_data app = Microdot() @app.post('/upload') @with_form_data async def upload(request): print('fields:', dict(request.form)) for name, file in request.files.items(): await file.save('/sdcard/' + sanitize(file.filename)) return 'ok'
تُخزَّن عمليات رفع الملفات مؤقتاً عبر
FileUpload.copy()، لذا يمكن للمعالج التكرار علىrequest.filesوrequest.formبحرية. تُنظَّف الملفات المؤقتة تلقائياً عند انتهاء الطلب.
للعمليات الرفع الأكبر من بضعة ميغابايت، فضّل واجهة FormDataIter التدفقية؛ إذ يجمع with_form_data() الطلب بأكمله في الذاكرة أو على نظام الملفات قبل تشغيل المعالج.