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