microdot.multipart — parsiranje multipart/form-data

Parsira tijela zahtjeva Content-Type: multipart/form-data – kodiranje koje preglednici koriste za obrasce koji uključuju <input type="file"> polja. Dvije inačice API-ja:

  • Streaming FormDataIter koji daje polja jedno po jedno – korisno kada aplikacija mora obraditi vrlo velike učitavanja dio po dio na uređaju s ograničenom memorijom.

  • Dekorator with_form_data() koji sve međuspremne i popunjava request.form / request.files – praktičan API za učitavanja uobičajene veličine.

class FormDataIter

class microdot.multipart.FormDataIter(request)

Asinkroni iterator preko dijelova multipart tijela od request. Dane vrijednosti su n-torke (name, value); value je str za obična polja i FileUpload za polja datoteka.

Koristi se izravno kada je memorija važnija od ergonomije:

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'

Napomena

Pri iteriranju preko polja datoteka, datoteka se mora potrošiti (putem FileUpload.read() ili FileUpload.save()) prije sljedeće async for iteracije – temeljni tok poništava se kada iteracija napreduje.

buffer_size: int

Atribut klase. Veličina bloka koja se koristi pri čitanju iz toka zahtjeva. Zadano 256 bajtova. Povećajte za veću propusnost po cijeni RAM-a.

class FileUpload

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

Jedna učitana datoteka. Instance daje FormDataIter i sakupljaju se u request.files putem with_form_data(). Aplikacije obično ne konstruiraju FileUpload izravno.

filename: str

Izvorni naziv datoteke onako kako ga je klijent poslao (nepouzdan – ne prosljeđujte ga u open() bez sanitizacije).

content_type: str | None

MIME tip iz zaglavlja Content-Type dijela, ili None ako nije naveden.

max_memory_size: int

Atribut klase. Prag (u bajtovima) iznad kojeg copy() prelazi s međuspremanja u memoriji na privremenu datoteku. Zadano 1024.

async read(n: int = -1)

Čita do n bajtova iz toka učitavanja. -1 čita do kraja.

async save(path_or_file)

Sprema učitanu datoteku u path_or_file, što može biti putanja u datotečnom sustavu ili već otvoreni objekt datoteke.

async copy(max_memory_size: int | None = None)

Međuspremnik za učitanu datoteku (bilo u RAM-u ili u privremenoj datoteci, ovisno o max_memory_size) kako bi se ostatak multipart tijela mogao parsirati bez poništavanja izvornog toka. Dekorator with_form_data() to poziva automatski.

async close()

Oslobađa svaku privremenu datoteku koju je stvorio copy(). Poziva se automatski kada zahtjev završi ako je učitana datoteka stigla do request.files putem with_form_data().

Dekoratori na razini modula

microdot.multipart.with_form_data(f)

Dekorator koji unaprijed parsira multipart tijelo i popunjava request.form i request.files prije izvođenja rukovatelja:

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'

Učitane datoteke se međuspremaju putem FileUpload.copy(), pa rukovatelj može slobodno iterirati request.files i request.form. Privremene datoteke automatski se čiste kada zahtjev završi.

Za učitavanja veća od nekoliko megabajta, preferirajte streaming API FormDataIter; with_form_data() akumulira cijeli zahtjev u memoriji ili u datotečnom sustavu prije izvođenja rukovatelja.