microdot — framework HTTP minimalista¶
O Microdot é um pequeno framework HTTP para MicroPython inspirado no Flask. É executado sobre asyncio, gere múltiplos clientes concorrentes sem utilizar threads, e expõe uma API familiar baseada em decoradores de rotas. Uma aplicação mínima tem o seguinte aspeto:
from microdot import Microdot
app = Microdot()
@app.route('/')
async def index(request):
return 'Hello, world!'
app.run(host='0.0.0.0', port=80)
class Microdot¶
- class microdot.Microdot¶
Uma instância de aplicação HTTP. Constrói-se uma instância perto do início do script e decora-se com handlers de rotas; chamar
run()ou aguardarstart_server()inicia o serviço.Registo de rotas
- route(url_pattern: str, methods: list | None = None) Callable¶
Decorador que regista um handler para url_pattern sob os métodos HTTP indicados (predefinição
['GET']). Devolve o decorador que, quando aplicado a uma função, a regista como handler e devolve a função inalterada.- url_pattern
Um padrão de caminho. Suporta segmentos estáticos (
/users) e segmentos dinâmicos delimitados por</>. Os segmentos dinâmicos aceitam um prefixo de tipo opcional separado por:–<int:id>,<path:rest>,<re:[0-9a-f]+:hex>. O tipo predefinido éstring.- methods
Lista de nomes de métodos HTTP. Se omitida, apenas
GETé correspondido.
O handler é chamado com o objeto de pedido em primeiro lugar, seguido de quaisquer segmentos dinâmicos capturados como argumentos de palavra-chave. O valor de retorno do handler torna-se a resposta HTTP: um
Response, uma string, um tuplo(body, status_code[, headers]), ou um dict / lista (enviado como JSON).
- get(url_pattern: str) Callable¶
Alias de conveniência para
route(url_pattern, methods=['GET'])– regista a função decorada como handlerGETpara url_pattern. Devolve o decorador.
- post(url_pattern: str) Callable¶
Alias de conveniência para
route(url_pattern, methods=['POST'])– regista a função decorada como handlerPOSTpara url_pattern. Devolve o decorador.
- put(url_pattern: str) Callable¶
Alias de conveniência para
route(url_pattern, methods=['PUT'])– regista a função decorada como handlerPUTpara url_pattern. Devolve o decorador.
- patch(url_pattern: str) Callable¶
Alias de conveniência para
route(url_pattern, methods=['PATCH'])– regista a função decorada como handlerPATCHpara url_pattern. Devolve o decorador.
- delete(url_pattern: str) Callable¶
Alias de conveniência para
route(url_pattern, methods=['DELETE'])– regista a função decorada como handlerDELETEpara url_pattern. Devolve o decorador.
Hooks de ciclo de vida
- before_request(f: Callable) Callable¶
Decorador que regista f para ser executada antes de cada pedido. f recebe o objeto de pedido; o seu valor de retorno é normalmente ignorado. Para curto-circuitar o pedido, retorne um
Response(ou um valor que seja convertível para um) – o restante pipeline é então ignorado e essa resposta é enviada. Devolve f inalterada.
- after_request(f: Callable) Callable¶
Decorador que regista f para ser executada após cada pedido bem-sucedido. f recebe
(request, response)e deve devolver o objeto de resposta (possivelmente modificado). Devolve f inalterada.
- after_error_request(f: Callable) Callable¶
Decorador que regista f para ser executada após o Microdot gerar uma resposta de erro (404, 500, exceção lançada, etc.). f recebe
(request, response)e deve devolver o objeto de resposta (possivelmente modificado). Devolve f inalterada.
- errorhandler(status_code_or_exception_class) Callable¶
Decorador que regista um handler personalizado para um código de estado HTTP ou uma classe de exceção Python. Para códigos de estado, o handler recebe apenas o pedido; para classes de exceção,
(request, exception). Devolve o decorador.
Montagem e abortar
- mount(subapp: Microdot, url_prefix: str = '', local: bool = False) None¶
Associa as rotas de outra instância
Microdotsob url_prefix. Quando local éFalse(predefinição), os handlers before / after / error da sub-aplicação também são associados ao pai. QuandoTrue, esses handlers são executados apenas para as rotas da sub-aplicação. DevolveNone.
- static abort(status_code: int, reason: str | None = None) None¶
Lança
HTTPExceptionpara abortar o pedido atual com o código de estado indicado. Nunca retorna normalmente – o framework captura a exceção e converte-a na resposta de erro correspondente. Conveniente no interior de corpos de rota:from microdot import abort @app.get('/users/<int:id>') def get_user(request, id): user = lookup(id) if user is None: abort(404) return user.to_dict()
Executar o servidor
- run(host: str = '0.0.0.0', port: int = 5000, debug: bool = False, ssl=None) None¶
Bloqueia a thread de chamada, executa
asyncio.run()sobrestart_server(). DevolveNoneapenas apósshutdown()ter sido chamado e o ciclo de escuta terminar. A forma mais simples de lançar uma aplicação autónoma:app.run(host='0.0.0.0', port=80)
- async start_server(host: str = '0.0.0.0', port: int = 5000, debug: bool = False, ssl=None, start_serving: bool = True) None¶
Inicia o servidor como uma corrotina. Use isto ao integrar com um ciclo de eventos
asyncioexistente juntamente com outras tarefas. A corrotina não retorna atéshutdown()ser chamado:async def main(): await asyncio.gather( app.start_server(port=80), capture_loop(), )
- host
Interface de rede a escutar.
'0.0.0.0'(predefinição) significa todas as interfaces;'127.0.0.1'significa apenas loopback.- port
Porta TCP a escutar. Predefinição
5000– use80para HTTP simples,443para HTTPS.- debug
Se
True, regista cada pedido e imprime tracebacks para stdout.- ssl
Um
ssl.SSLContextpara envolver as ligações recebidas em TLS.None(predefinição) significa HTTP simples.- start_serving
Relevante apenas no CPython; ignorado no MicroPython.
- shutdown() None¶
Solicita um encerramento gracioso do servidor. Seguro para chamar a partir de um handler de rota – o pedido atual é concluído antes do ciclo terminar. Retorna imediatamente; o encerramento efetivo ocorre assim que o pedido em curso terminar.
Atributos
- url_map: list¶
Lista de rotas registadas como tuplos
(methods, URLPattern, handler, url_prefix, subapp).
- before_request_handlers: list¶
Lista de chamáveis registados com
before_request(), por ordem de registo. Cada um é executado com o objeto de pedido antes do handler de rota. Alterar a lista diretamente é possível, mas raramente necessário – prefira o decorador.
- after_request_handlers: list¶
Lista de chamáveis registados com
after_request(), por ordem de registo. Cada um é executado com(request, response)após um pedido bem-sucedido e deve devolver a resposta (possivelmente modificada).
- after_error_request_handlers: list¶
Lista de chamáveis registados com
after_error_request(), por ordem de registo. Cada um é executado com(request, response)após ser gerada uma resposta de erro (pelo framework ou por um handler de erro da aplicação) e deve devolver a resposta.
- error_handlers: dict¶
Mapeamento de chaves de erro para chamáveis de handler, preenchido por
errorhandler(). As chaves são códigos de estado HTTP (int) ou classes de exceção Python; os valores são os handlers registados. Os handlers de código de estado recebem(request); os handlers de classe de exceção recebem(request, exception).
class Request¶
- class microdot.Request¶
Um pedido HTTP recebido. As instâncias são passadas aos handlers de rota como primeiro argumento posicional. As aplicações não constroem
Requestdiretamente.Atributos de classe
- max_content_length: int¶
Rejeita pedidos cujo
Content-Lengthexceda este número de bytes com uma resposta 413. Predefinição 16 KB.
- max_body_length: int¶
Maior corpo que é armazenado em memória e exposto via
body. Corpos maiores (atémax_content_length) permanecem no socket e devem ser lidos através destream. Predefinição 16 KB.
- max_readline: int¶
Comprimento máximo de uma linha de pedido / linha de cabeçalho em bytes. Predefinição 2 KB.
Atributos de instância
- headers: NoCaseDict¶
Cabeçalhos do pedido como
NoCaseDict(pesquisa insensível a maiúsculas/minúsculas).
- g: object¶
Um contentor de livre forma por pedido (um objeto simples). Atribua-lhe atributos para passar valores entre hooks e handlers (
request.g.user = ...).
- route: Callable¶
A função de handler que correspondeu a este pedido.
Acesso ao corpo
- body: bytes¶
O corpo completo do pedido como
bytes. Vazio quando o corpo está a ser transmitido em stream (verstream).
- stream: object¶
Um objeto de stream assíncrono que expõe
read()sobre o corpo. Use isto para corpos maiores quemax_body_length.
- json: dict | list | str | int | float | bool | None¶
O corpo analisado como JSON (um
dict,list,str,int,float, oubool– o que o payload codificar), ouNonese oContent-Typenão forapplication/json.
- form: MultiDict | None¶
Campos de formulário com codificação URL como
MultiDict, ouNone. Paramultipart/form-data, decore a rota commicrodot.multipart.with_form_data().
- files: dict | None¶
Ficheiros carregados como
{name: FileUpload}, preenchido pormicrodot.multipart.with_form_data().Noneaté o decorador ser executado.
- after_request(f: Callable) Callable¶
Regista um hook after-request local ao pedido – executado após os handlers after-request ao nível da aplicação, apenas em caso de sucesso. f recebe
(request, response)e deve devolver o objeto de resposta (possivelmente modificado). Devolve f inalterada.
class Response¶
- class microdot.Response(body=b'', status_code: int = 200, headers: dict | None = None, reason: str | None = None)¶
Uma resposta HTTP. A maioria dos handlers devolve valores que o Microdot converte automaticamente para
Response; construa um diretamente quando precisar de cabeçalhos personalizados ou de um código de estado específico.- body
Corpo da resposta.
stré codificado em UTF-8;dict/listé codificado como JSON e oContent-Typeé definido em conformidade;bytesé enviado tal como está; um objeto do tipo ficheiro ou um gerador assíncrono transmite em stream.- status_code
Estado HTTP numérico. Predefinição 200.
- headers
Dict de cabeçalhos de resposta (insensível a maiúsculas/minúsculas).
- reason
Frase de razão personalizada. Predefinição
"OK"para 200 e"N/A"caso contrário.
Atributos de classe
- default_content_type: str¶
Content-Type utilizado quando nenhum é definido explicitamente. Predefinição
'text/plain'.
- default_send_file_max_age: int | None¶
Valor de
Cache-Control: max-ageparasend_file()quandomax_agenão é fornecido.None(predefinição) significa sem cabeçalho Cache-Control.
- send_file_buffer_size: int¶
Tamanho do bloco para streaming em
send_file(). Predefinição 1024.
- already_handled: None¶
Sentinela devolvido por handlers que já escreveram a resposta diretamente (utilizado por upgrades WebSocket). Sempre
None; é a identidade que importa.
- types_map: dict¶
Mapa de extensão para tipo MIME utilizado por
send_file()para inferência de tipo de conteúdo. Mapeiacss,gif,html,jpg,js,json,png,txt,svg.
Métodos
- set_cookie(cookie: str, value: str, path: str | None = None, domain: str | None = None, expires=None, max_age: int | None = None, secure: bool = False, http_only: bool = False, partitioned: bool = False) None¶
Adiciona um cabeçalho
Set-Cookie. expires pode ser uma string pré-formatada ou um objeto semelhante adatetimecomtimetuple(). DevolveNone; o cabeçalho é acrescentado a esta resposta no local.
- delete_cookie(cookie: str, **kwargs) None¶
Define um
Set-Cookieque expira o cookie indicado imediatamente.kwargsaceita as mesmas opções queset_cookie()(path,domain,secure,http_only,partitioned);expiresemax_agesão ignorados. DevolveNone; o cabeçalho é acrescentado a esta resposta no local.
- classmethod redirect(location: str, status_code: int = 302) Response¶
Devolve uma resposta de redirecionamento:
@app.get('/old') def old(request): return Response.redirect('/new')
- classmethod send_file(filename: str, status_code: int = 200, content_type: str | None = None, stream=None, max_age: int | None = None, compressed: bool | str = False, file_extension: str = '') Response¶
Transmite em stream um ficheiro do sistema de ficheiros como corpo da resposta.
content_typeé inferido a partir da extensão viatypes_mapse não for fornecido.compressed=TruedefineContent-Encoding: gzip(o ficheiro já deve estar comprimido).Aviso
filename é aberto diretamente. Nunca passe um caminho fornecido pelo utilizador sem sanitização – fazer isso permite a divulgação arbitrária de ficheiros.
Exceções¶
class URLPattern¶
- class microdot.URLPattern(url_pattern: str)¶
A forma compilada do padrão de URL de uma rota. Construído automaticamente por
Microdot.route(); as aplicações raramente instanciam um diretamente.- classmethod register_type(type_name: str, pattern: str = '[^/]+', parser: Callable | None = None) None¶
Regista um novo tipo de segmento dinâmico para utilização em padrões de rota. Devolve
None; o tipo é adicionado ao registo de tipos ao nível da classe. Por exemplo, para adicionar um tipo<uuid:...>URLPattern.register_type('uuid', '[0-9a-f-]{36}')parser é um chamável opcional que converte a string capturada antes de esta chegar ao handler.
Classes auxiliares¶
- class microdot.MultiDict(initial_dict: dict | None = None)¶
Uma subclasse de dict que armazena múltiplos valores por chave. Utilizada para query strings e corpos de formulário com codificação URL onde a mesma chave pode aparecer mais do que uma vez (
?tag=a&tag=b).
- class microdot.NoCaseDict¶
Uma subclasse de dict com chaves de string insensíveis a maiúsculas/minúsculas. Utilizada para
Request.headerseResponse.headers.
Funções ao nível do módulo¶
- microdot.abort(status_code: int, reason: str | None = None) None¶
Atalho para
Microdot.abort(). Nunca retorna normalmente – lançaHTTPException. Importável comofrom microdot import abort.
- microdot.redirect(location: str, status_code: int = 302) Response¶
Atalho para
Response.redirect(). Importável comofrom microdot import redirect.
- microdot.send_file(filename: str, **kwargs) Response¶
Atalho para
Response.send_file().
- microdot.urlencode(s: str) str¶
Codifica em percentagem um componente de URL. Substitui caracteres com significado reservado num URL (
/,?,&,=,#, espaço, …) pelos seus escapes hexadecimais%xx, para que o resultado possa ser colocado com segurança dentro de um segmento de caminho ou valor de query. Devolve astrcodificada.
- microdot.urldecode(s: str) str¶
Descodifica em percentagem um componente de URL – o inverso de
urlencode(). Os escapes%xxsão substituídos pelo byte que codificam, e+é convertido em espaço (a convenção histórica das query strings). Devolve astrdescodificada.
Submódulos¶
microdot.auth— autenticação HTTPmicrodot.cors— Partilha de Recursos entre Origens (CORS)microdot.csrf— proteção CSRFmicrodot.login— fluxo de autenticação de utilizadoresmicrodot.multipart— análise de multipart/form-datamicrodot.session— sessões por cookie assinadomicrodot.sse— Server-Sent Eventsmicrodot.websocket— Suporte a WebSocket