microdot.multipart — multipart/form-data feldolgozás¶
A Content-Type: multipart/form-data kéréstörzseket dolgozza fel – ezt a kódolást használják a böngészők azoknál az űrlapoknál, amelyek <input type="file"> mezőket tartalmaznak. Az API-nak két változata van:
Egy streamelő
FormDataIter, amely a mezőket egyesével adja vissza – hasznos, amikor az alkalmazásnak nagyon nagy feltöltéseket kell darabonként kezelnie egy korlátozott memóriájú eszközön.Egy
with_form_data()dekorátor, amely mindent pufferel, és feltölti arequest.form/request.filesattribútumokat – a kényelmes API a normál méretű feltöltésekhez.
class FormDataIter¶
- class microdot.multipart.FormDataIter(request)¶
Aszinkron iterátor a request multipart törzsének részein. A visszaadott értékek
(name, value)entitások; a value egystra normál mezőknél, és egyFileUploada fájlmezőknél.Közvetlenül akkor használatos, amikor a memória fontosabb az ergonómiánál:
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'
Megjegyzés
Fájlmezőkön való iteráláskor a fájlt fel kell dolgozni (a
FileUpload.read()vagyFileUpload.save()segítségével) a következőasync foriteráció előtt – az iteráció előrelépésekor az alatta lévő stream érvénytelenné válik.
class FileUpload¶
- class microdot.multipart.FileUpload(filename: str, content_type: str | None, read)¶
Egyetlen feltöltött fájl. A példányokat a
FormDataIteradja vissza, és awith_form_data()gyűjti össze arequest.filesattribútumba. Az alkalmazások általában nem hozzák létre közvetlenül aFileUploadobjektumot.- filename: str¶
A fájl eredeti neve úgy, ahogy a kliens elküldte (nem megbízható – ne add át az
open()függvénynek tisztítás nélkül).
- content_type: str | None¶
A rész
Content-Typefejlécéből származó MIME-típus, vagyNone, ha nincs megadva.
- max_memory_size: int¶
Osztályattribútum. Az a küszöbérték (bájtban), amely felett a
copy()a memóriában történő pufferelésről átkapcsol egy ideiglenes fájlra. Alapértelmezett 1024.
- async save(path_or_file)¶
Elmenti a feltöltést a path_or_file helyre, amely lehet egy fájlrendszer-útvonal vagy egy már megnyitott fájlobjektum.
- async copy(max_memory_size: int | None = None)¶
Pufferli a feltöltést (vagy a RAM-ban, vagy egy ideiglenes fájlban, a
max_memory_sizeértékétől függően), hogy a multipart törzs többi része feldolgozható legyen anélkül, hogy az eredeti stream érvénytelenné válna. Awith_form_data()dekorátor ezt automatikusan meghívja.
- async close()¶
Felszabadít minden, a
copy()által létrehozott ideiglenes fájlt. Automatikusan meghívásra kerül a kérés befejeztével, ha a feltöltés awith_form_data()segítségével jutott el arequest.filesattribútumba.
Modulszintű dekorátorok¶
- microdot.multipart.with_form_data(f)¶
Dekorátor, amely előre feldolgozza a multipart törzset, és feltölti a
request.formésrequest.filesattribútumokat, mielőtt a kezelő lefut: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'
A fájlfeltöltések a
FileUpload.copy()segítségével pufferelődnek, így a kezelő szabadon iterálhat arequest.filesésrequest.formattribútumokon. Az ideiglenes fájlok automatikusan törlődnek, amikor a kérés befejeződik.
Néhány megabájtnál nagyobb feltöltésekhez használd inkább a streamelő FormDataIter API-t; a with_form_data() a teljes kérést a memóriában vagy a fájlrendszeren halmozza fel, mielőtt a kezelő lefut.