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
FormDataIterkoji 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 popunjavarequest.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 jestrza obična polja iFileUploadza 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()iliFileUpload.save()) prije sljedećeasync foriteracije – temeljni tok poništava se kada iteracija napreduje.
class FileUpload¶
- class microdot.multipart.FileUpload(filename: str, content_type: str | None, read)¶
Jedna učitana datoteka. Instance daje
FormDataIteri sakupljaju se urequest.filesputemwith_form_data(). Aplikacije obično ne konstruirajuFileUploadizravno.- filename: str¶
Izvorni naziv datoteke onako kako ga je klijent poslao (nepouzdan – ne prosljeđujte ga u
open()bez sanitizacije).
- max_memory_size: int¶
Atribut klase. Prag (u bajtovima) iznad kojeg
copy()prelazi s međuspremanja u memoriji na privremenu datoteku. Zadano 1024.
- 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. Dekoratorwith_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 dorequest.filesputemwith_form_data().
Dekoratori na razini modula¶
- microdot.multipart.with_form_data(f)¶
Dekorator koji unaprijed parsira multipart tijelo i popunjava
request.formirequest.filesprije 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 iteriratirequest.filesirequest.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.