microdot.multipart — multipart/form-data-jäsennys

Jäsentää Content-Type: multipart/form-data -pyyntörungot – koodaus, jota selaimet käyttävät lomakkeissa, jotka sisältävät <input type="file"> -kenttiä. API:sta on kahta tyyppiä:

  • Suoratoistava FormDataIter, joka tuottaa kentät yksi kerrallaan – hyödyllinen, kun sovelluksen on käsiteltävä erittäin suuria latauksia pala kerrallaan muistirajoitteisella laitteella.

  • with_form_data()-dekoraattori, joka puskuroi kaiken ja täyttää request.form / request.files – kätevä API tavallisen kokoisille latauksille.

class FormDataIter

class microdot.multipart.FormDataIter(request)

Asynkroninen iteraattori pyynnön request multipart-rungon osien yli. Tuotetut arvot ovat (name, value) -monikkoja; value on str tavallisille kentille ja FileUpload tiedostokentille.

Käytetään suoraan, kun muisti on tärkeämpää kuin ergonomia:

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'

Muista

Tiedostokenttien yli iteroitaessa tiedosto on kulutettava (metodilla FileUpload.read() tai FileUpload.save()) ennen seuraavaa async for -iteraatiota – taustalla oleva virta mitätöityy, kun iterointi etenee.

buffer_size: int

Luokka-attribuutti. Lohkokoko, jota käytetään pyyntövirrasta luettaessa. Oletus 256 tavua. Kasvata suuremman läpäisykyvyn saavuttamiseksi RAM-muistin kustannuksella.

class FileUpload

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

Yksittäinen ladattu tiedosto. FormDataIter tuottaa instanssit ja with_form_data() kerää ne kohteeseen request.files. Sovellukset eivät yleensä rakenna FileUpload-objektia suoraan.

filename: str

Tiedoston alkuperäinen nimi sellaisena kuin asiakas sen lähetti (ei luotettava – älä välitä sitä funktiolle open() ilman puhdistamista).

content_type: str | None

MIME-tyyppi osan Content-Type-otsakkeesta tai None, jos sitä ei ole annettu.

max_memory_size: int

Luokka-attribuutti. Kynnysarvo (tavuina), jonka ylittyessä copy() vaihtaa muistinvaraisesta puskuroinnista väliaikaistiedostoon. Oletus 1024.

async read(n: int = -1)

Lukee enintään n tavua lataisvirrasta. -1 lukee loppuun asti.

async save(path_or_file)

Tallentaa latauksen kohteeseen path_or_file, joka voi olla tiedostojärjestelmän polku tai jo avattu tiedosto-objekti.

async copy(max_memory_size: int | None = None)

Puskuroi latauksen (joko RAM-muistiin tai väliaikaistiedostoon riippuen asetuksesta max_memory_size), jotta loput multipart-rungosta voidaan jäsentää ilman, että alkuperäinen virta mitätöityy. with_form_data()-dekoraattori kutsuu tätä automaattisesti.

async close()

Vapauttaa copy()-metodin luoman mahdollisen väliaikaistiedoston. Kutsutaan automaattisesti pyynnön päättyessä, jos lataus saavutti kohteen request.files with_form_data()-dekoraattorin kautta.

Moduulitason dekoraattorit

microdot.multipart.with_form_data(f)

Dekoraattori, joka jäsentää multipart-rungon etukäteen ja täyttää request.form ja request.files ennen käsittelijän suoritusta:

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'

Tiedostolataukset puskuroidaan metodilla FileUpload.copy(), joten käsittelijä voi iteroida request.files ja request.form vapaasti. Väliaikaistiedostot siivotaan automaattisesti pyynnön päättyessä.

Paria megatavua suuremmille latauksille suosi suoratoistavaa FormDataIter-API:a; with_form_data() kerää koko pyynnön muistiin tai tiedostojärjestelmään ennen käsittelijän suoritusta.