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 bir with_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 bir str ve dosya alanları için bir FileUpload değ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 for yinelemesinden önce dosya tüketilmelidir (FileUpload.read() veya FileUpload.save() aracılığıyla) – yineleme ilerlediğinde alttaki akış geçersiz hale gelir.

buffer_size: int

Sınıf özniteliği. İstek akışından okuma yapılırken kullanılan parça boyutu. Varsayılan 256 bayt. Daha yüksek iş hacmi için RAM pahasına artırın.

class FileUpload

class microdot.multipart.FileUpload(filename: str, content_type: str | None, read)

Yüklenen tek bir dosya. Örnekler FormDataIter tarafından verilir ve with_form_data() tarafından request.files içinde toplanır. Uygulamalar normalde FileUpload öğ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-Type başlığından gelen MIME türü veya sağlanmamışsa None.

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 read(n: int = -1)

Yükleme akışından en fazla n bayt okur. -1 sona kadar okur.

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_size değ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ığıyla request.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.form ile request.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şleyici request.files ve request.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.