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 onstrtavallisille kentille jaFileUploadtiedostokentille.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()taiFileUpload.save()) ennen seuraavaaasync for-iteraatiota – taustalla oleva virta mitätöityy, kun iterointi etenee.
class FileUpload¶
- class microdot.multipart.FileUpload(filename: str, content_type: str | None, read)¶
Yksittäinen ladattu tiedosto.
FormDataItertuottaa instanssit jawith_form_data()kerää ne kohteeseenrequest.files. Sovellukset eivät yleensä rakennaFileUpload-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 taiNone, jos sitä ei ole annettu.
- max_memory_size: int¶
Luokka-attribuutti. Kynnysarvo (tavuina), jonka ylittyessä
copy()vaihtaa muistinvaraisesta puskuroinnista väliaikaistiedostoon. Oletus 1024.
- 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 kohteenrequest.fileswith_form_data()-dekoraattorin kautta.
Moduulitason dekoraattorit¶
- microdot.multipart.with_form_data(f)¶
Dekoraattori, joka jäsentää multipart-rungon etukäteen ja täyttää
request.formjarequest.filesennen 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 iteroidarequest.filesjarequest.formvapaasti. 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.