microdot.multipart — análise de multipart/form-data¶
Analisa corpos de requisição Content-Type: multipart/form-data – a codificação que os navegadores usam para formulários que incluem campos <input type="file">. Dois tipos de API:
Um
FormDataIterde streaming que produz os campos um de cada vez – útil quando a aplicação precisa lidar com uploads muito grandes parte por parte em um dispositivo com memória limitada.Um decorador
with_form_data()que armazena tudo em buffer e preencherequest.form/request.files– a API conveniente para uploads de tamanho normal.
class FormDataIter¶
- class microdot.multipart.FormDataIter(request)¶
Iterador assíncrono sobre as partes do corpo multipart de request. Os valores produzidos são tuplas
(name, value); value é umastrpara campos comuns e umFileUploadpara campos de arquivo.Usado diretamente quando a memória importa mais do que a 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'
Nota
Ao iterar sobre campos de arquivo, o arquivo deve ser consumido (via
FileUpload.read()ouFileUpload.save()) antes da próxima iteraçãoasync for– o stream subjacente é invalidado quando a iteração avança.
class FileUpload¶
- class microdot.multipart.FileUpload(filename: str, content_type: str | None, read)¶
Um único arquivo enviado. As instâncias são produzidas por
FormDataItere coletadas emrequest.filesporwith_form_data(). As aplicações normalmente não constroemFileUploaddiretamente.- filename: str¶
O nome original do arquivo como o cliente o enviou (não confiável – não passe para
open()sem sanitizar).
- max_memory_size: int¶
Atributo de classe. Limiar (em bytes) acima do qual
copy()troca o buffer em memória por um arquivo temporário. Padrão 1024.
- async save(path_or_file)¶
Salva o upload em path_or_file, que pode ser um caminho do sistema de arquivos ou um objeto de arquivo já aberto.
- async copy(max_memory_size: int | None = None)¶
Armazena o upload em buffer (seja na RAM ou em um arquivo temporário, dependendo de
max_memory_size) para que o restante do corpo multipart possa ser analisado sem que o stream original seja invalidado. O decoradorwith_form_data()chama isso automaticamente.
- async close()¶
Libera qualquer arquivo temporário criado por
copy(). Chamado automaticamente quando a requisição termina, se o upload chegou arequest.filesviawith_form_data().
Decoradores de nível de módulo¶
- microdot.multipart.with_form_data(f)¶
Decorador que analisa o corpo multipart antecipadamente e preenche
request.formerequest.filesantes de o manipulador ser executado: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'
Os uploads de arquivo são armazenados em buffer via
FileUpload.copy(), de modo que o manipulador possa iterar sobrerequest.fileserequest.formlivremente. Os arquivos temporários são limpos automaticamente quando a requisição termina.
Para uploads maiores do que alguns megabytes, prefira a API de streaming FormDataIter; with_form_data() acumula a requisição inteira na memória ou no sistema de arquivos antes de o manipulador ser executado.