microdot.multipart — multipart/form-data ayrıştırma¶
Content-Type: multipart/form-data istek gövdelerini ayrıştırır – tarayıcıların <input type="file"> alanları içeren formlar için kullandığı kodlama. İki tür API vardır:
Alanları teker teker veren akışlı bir
FormDataIter– uygulamanın bellek kısıtlı bir cihazda çok büyük yüklemeleri parça parça işlemesi gerektiğinde kullanışlıdır.Her şeyi arabelleğe alan ve
request.form/request.filesöğesini dolduran birwith_form_data()dekoratörü – normal boyutlu yüklemeler için kullanışlı API.
class FormDataIter¶
- class microdot.multipart.FormDataIter(request)¶
request öğesinin multipart gövdesinin parçaları üzerinde asenkron yineleyici. Verilen değerler
(name, value)demetleridir; value, normal alanlar için birstrve dosya alanları için birFileUploaddeğeridir.Bellek, ergonomiden daha önemli olduğunda doğrudan kullanılır:
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'
Not
Dosya alanları üzerinde yineleme yaparken, bir sonraki
async foryinelemesinden önce dosya tüketilmelidir (FileUpload.read()veyaFileUpload.save()aracılığıyla) – yineleme ilerlediğinde alttaki akış geçersiz hale gelir.
class FileUpload¶
- class microdot.multipart.FileUpload(filename: str, content_type: str | None, read)¶
Yüklenen tek bir dosya. Örnekler
FormDataItertarafından verilir vewith_form_data()tarafındanrequest.filesiçinde toplanır. Uygulamalar normaldeFileUploadöğesini doğrudan oluşturmaz.- filename: str¶
İstemcinin gönderdiği şekliyle dosyanın orijinal adı (güvenilmez – sanitize etmeden
open()öğesine geçirmeyin).
- content_type: str | None¶
Parçanın
Content-Typebaşlığından gelen MIME türü veya sağlanmamışsaNone.
- max_memory_size: int¶
Sınıf özniteliği.
copy()öğesinin bellek içi arabelleğe almadan geçici bir dosyaya geçtiği eşik (bayt cinsinden). Varsayılan 1024.
- async save(path_or_file)¶
Yüklemeyi, bir dosya sistemi yolu veya zaten açık bir dosya nesnesi olabilen path_or_file öğesine kaydeder.
- async copy(max_memory_size: int | None = None)¶
Yüklemeyi arabelleğe alır (
max_memory_sizedeğerine bağlı olarak ya RAM’de ya da bir geçici dosyada); böylece multipart gövdesinin geri kalanı, orijinal akış geçersiz kılınmadan ayrıştırılabilir.with_form_data()dekoratörü bunu otomatik olarak çağırır.
- async close()¶
copy()tarafından oluşturulan herhangi bir geçici dosyayı serbest bırakır. Yükleme,with_form_data()aracılığıylarequest.filesöğesine ulaştıysa, istek tamamlandığında otomatik olarak çağrılır.
Modül düzeyinde dekoratörler¶
- microdot.multipart.with_form_data(f)¶
İşleyici çalışmadan önce multipart gövdesini baştan ayrıştıran ve
request.formilerequest.filesöğelerini dolduran dekoratör: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'
Dosya yüklemeleri
FileUpload.copy()aracılığıyla arabelleğe alınır; böylece işleyicirequest.filesverequest.formüzerinde serbestçe yineleme yapabilir. Geçici dosyalar, istek sona erdiğinde otomatik olarak temizlenir.
Birkaç megabayttan büyük yüklemeler için akışlı FormDataIter API’sini tercih edin; with_form_data(), işleyici çalışmadan önce tüm isteği bellekte veya dosya sisteminde biriktirir.