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 a request.form / request.files attribú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 egy str a normál mezőknél, és egy FileUpload a 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() vagy FileUpload.save() segítségével) a következő async for iteráció előtt – az iteráció előrelépésekor az alatta lévő stream érvénytelenné válik.

buffer_size: int

Osztályattribútum. A kérés streamjéből való olvasáskor használt darabméret. Alapértelmezett 256 bájt. Növeld a nagyobb átviteli teljesítményért a RAM rovására.

class FileUpload

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

Egyetlen feltöltött fájl. A példányokat a FormDataIter adja vissza, és a with_form_data() gyűjti össze a request.files attribútumba. Az alkalmazások általában nem hozzák létre közvetlenül a FileUpload objektumot.

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-Type fejlécéből származó MIME-típus, vagy None, 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 read(n: int = -1)

Legfeljebb n bájtot olvas a feltöltési streamből. A -1 a végéig olvas.

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. A with_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 a with_form_data() segítségével jutott el a request.files attribú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 és request.files attribú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 a request.files és request.form attribú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.