microdot — minimalt HTTP-ramverk

Microdot är ett litet, Flask-inspirerat HTTP-ramverk för MicroPython. Det körs ovanpå asyncio, hanterar flera samtidiga klienter utan trådar och exponerar ett välbekant API med rutt-dekoratorer. En minimal applikation ser ut så här:

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

En HTTP-applikationsinstans. En instans skapas nära toppen av skriptet och dekoreras med rutthanterare; ett anrop till run() eller en await på start_server() påbörjar betjäningen.

Ruttregistrering

route(url_pattern: str, methods: list | None = None) Callable

Dekorator som registrerar en hanterare för url_pattern under de angivna HTTP-metoderna (standard ['GET']). Returnerar dekoratorn som, när den tillämpas på en funktion, registrerar den som hanterare och returnerar funktionen oförändrad.

url_pattern

Ett sökvägsmönster. Stöder statiska segment (/users) och dynamiska segment inneslutna i < / >. Dynamiska segment accepterar ett valfritt typprefix avskilt med :<int:id>, <path:rest>, <re:[0-9a-f]+:hex>. Standardtypen är string.

methods

Lista med namn på HTTP-metoder. Om den utelämnas matchas endast GET.

Hanteraren anropas först med begärandeobjektet och sedan med eventuella infångade dynamiska segment som nyckelordsargument. Hanterarens returvärde blir HTTP-svaret: ett Response, en sträng, en tupel (body, status_code[, headers]), eller en dict / list (skickas som JSON).

get(url_pattern: str) Callable

Bekvämt alias för route(url_pattern, methods=['GET']) – registrerar den dekorerade funktionen som en GET-hanterare för url_pattern. Returnerar dekoratorn.

post(url_pattern: str) Callable

Bekvämt alias för route(url_pattern, methods=['POST']) – registrerar den dekorerade funktionen som en POST-hanterare för url_pattern. Returnerar dekoratorn.

put(url_pattern: str) Callable

Bekvämt alias för route(url_pattern, methods=['PUT']) – registrerar den dekorerade funktionen som en PUT-hanterare för url_pattern. Returnerar dekoratorn.

patch(url_pattern: str) Callable

Bekvämt alias för route(url_pattern, methods=['PATCH']) – registrerar den dekorerade funktionen som en PATCH-hanterare för url_pattern. Returnerar dekoratorn.

delete(url_pattern: str) Callable

Bekvämt alias för route(url_pattern, methods=['DELETE']) – registrerar den dekorerade funktionen som en DELETE-hanterare för url_pattern. Returnerar dekoratorn.

Livscykelkrokar

before_request(f: Callable) Callable

Dekorator som registrerar f så att den körs före varje begäran. f tar begärandeobjektet; dess returvärde ignoreras normalt. För att kortsluta begäran, returnera ett Response (eller ett värde som konverteras till ett) – resten av pipelinen hoppas då över och det svaret skickas. Returnerar f oförändrad.

after_request(f: Callable) Callable

Dekorator som registrerar f så att den körs efter varje lyckad begäran. f tar (request, response) och måste returnera det (eventuellt modifierade) svarsobjektet. Returnerar f oförändrad.

after_error_request(f: Callable) Callable

Dekorator som registrerar f så att den körs efter att Microdot har genererat ett felsvar (404, 500, kastat undantag etc.). f tar (request, response) och måste returnera det (eventuellt modifierade) svarsobjektet. Returnerar f oförändrad.

errorhandler(status_code_or_exception_class) Callable

Dekorator som registrerar en anpassad hanterare för en HTTP-statuskod eller en Python-undantagsklass. För statuskoder tar hanteraren endast begäran; för undantagsklasser (request, exception). Returnerar dekoratorn.

Montering och avbrytande

mount(subapp: Microdot, url_prefix: str = '', local: bool = False) None

Anslut en annan Microdot-instans rutter under url_prefix. När local är False (standard) ansluts delapplikationens before / after / error-hanterare även till föräldern. När True körs dessa hanterare endast för delapplikationens rutter. Returnerar None.

static abort(status_code: int, reason: str | None = None) None

Kasta HTTPException för att avbryta den aktuella begäran med den angivna statuskoden. Returnerar aldrig normalt – ramverket fångar undantaget och omvandlar det till motsvarande felsvar. Bekvämt inuti ruttkroppar:

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()

Köra servern

run(host: str = '0.0.0.0', port: int = 5000, debug: bool = False, ssl=None) None

Blockera den anropande tråden och kör asyncio.run()start_server(). Returnerar None först efter att shutdown() har anropats och lyssningsloopen avslutas. Det enklaste sättet att starta en fristående applikation:

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

Starta servern som en korutin. Använd detta vid integrering med en befintlig asyncio-händelseloop tillsammans med andra uppgifter. Korutinen returnerar inte förrän shutdown() anropas:

async def main():
    await asyncio.gather(
        app.start_server(port=80),
        capture_loop(),
    )
host

Nätverksgränssnitt att lyssna på. '0.0.0.0' (standard) betyder alla gränssnitt; '127.0.0.1' betyder endast loopback.

port

TCP-port att lyssna på. Standard 5000 – välj 80 för vanlig HTTP, 443 för HTTPS.

debug

Om True, logga varje begäran och dumpa stackspårningar till stdout.

ssl

Ett ssl.SSLContext för att inkapsla inkommande anslutningar i TLS. None (standard) betyder vanlig HTTP.

start_serving

Endast relevant på CPython; ignoreras på MicroPython.

shutdown() None

Begär en kontrollerad serveravstängning. Säkert att anropa från en rutthanterare – den aktuella begäran slutförs innan loopen avslutas. Returnerar omedelbart; den faktiska avstängningen sker när den pågående begäran är klar.

Attribut

url_map: list

Lista över registrerade rutter som tupler (methods, URLPattern, handler, url_prefix, subapp).

before_request_handlers: list

Lista över anropbara objekt registrerade med before_request(), i registreringsordning. Varje körs med begärandeobjektet innan rutthanteraren. Att mutera listan direkt fungerar men behövs sällan – föredra dekoratorn.

after_request_handlers: list

Lista över anropbara objekt registrerade med after_request(), i registreringsordning. Varje körs med (request, response) efter en lyckad begäran och måste returnera det (eventuellt modifierade) svaret.

after_error_request_handlers: list

Lista över anropbara objekt registrerade med after_error_request(), i registreringsordning. Varje körs med (request, response) efter att ett felsvar har genererats (av ramverket eller av en applikationsfelhanterare) och måste returnera svaret.

error_handlers: dict

Mappning av felnycklar till anropbara hanterare, fylld av errorhandler(). Nycklar är antingen HTTP-statuskoder (int) eller Python-undantagsklasser; värden är de registrerade hanterarna. Statuskodshanterare tar (request); undantagsklasshanterare tar (request, exception).

debug: bool

True medan servern körs med debug=True.

class Request

class microdot.Request

En inkommande HTTP-begäran. Instanser skickas till rutthanterare som det första positionsargumentet. Applikationer konstruerar inte Request direkt.

Klassattribut

max_content_length: int

Avvisa begäranden vars Content-Length överstiger detta antal byte med ett 413-svar. Standard 16 KB.

max_body_length: int

Den största kropp som buffras i minnet och exponeras via body. Större kroppar (upp till max_content_length) stannar kvar på socketen och måste läsas via stream. Standard 16 KB.

max_readline: int

Maximal längd för en enskild begäranderad / headerrad i byte. Standard 2 KB.

Instansattribut

app: Microdot

Den Microdot-instans som hanterar begäran.

client_addr: tuple

Klientens adress som (host, port).

method: str

Sträng med HTTP-metoden ('GET', 'POST', …).

scheme: str

'http' eller 'https'.

url: str

Den fullständiga sökvägen och frågesträngen i begärande-URL:en (allt efter värden).

path: str

Endast sökvägsdelen.

query_string: str | None

Den råa frågesträngsdelen, eller None.

args: MultiDict

Tolkad frågesträng som en MultiDict.

headers: NoCaseDict

Begärandehuvuden som en NoCaseDict (skiftlägesokänslig uppslagning).

cookies: dict

Tolkat Cookie-huvud som en dict.

content_length: int

Heltalsvärdet för Content-Length, eller 0 om det saknas.

content_type: str | None

Värdet för Content-Type-huvudet, eller None.

g: object

En friformad behållare per begäran (ett kalt objekt). Tilldela attribut till den för att skicka värden mellan krokar och hanterare (request.g.user = ...).

route: Callable

Den hanterarfunktion som matchade denna begäran.

url_prefix: str

Prefixet som rutten monterades under, eller ''.

subapp: Microdot | None

Den monterade delapplikationsinstansen, eller None.

Åtkomst till kropp

body: bytes

Den fullständiga begärandekroppen som bytes. Tom när kroppen strömmas (se stream).

stream: object

Ett asynkront strömobjekt som exponerar read() över kroppen. Använd detta för kroppar större än max_body_length.

json: dict | list | str | int | float | bool | None

Kroppen tolkad som JSON (en dict, list, str, int, float eller bool – vad än nyttolasten kodar), eller None om Content-Type inte är application/json.

form: MultiDict | None

URL-kodade formulärfält som en MultiDict, eller None. För multipart/form-data, dekorera rutten med microdot.multipart.with_form_data().

files: dict | None

Uppladdade filer som {name: FileUpload}, fylls av microdot.multipart.with_form_data(). None tills den dekoratorn körs.

after_request(f: Callable) Callable

Registrera en begärandelokal after-request-krok – körs efter after-request-hanterarna på applikationsnivå, endast vid framgång. f tar (request, response) och måste returnera det (eventuellt modifierade) svarsobjektet. Returnerar f oförändrad.

class Response

class microdot.Response(body=b'', status_code: int = 200, headers: dict | None = None, reason: str | None = None)

Ett HTTP-svar. De flesta hanterare returnerar värden som Microdot automatiskt konverterar till ett Response; konstruera ett direkt när du behöver anpassade huvuden eller en specifik statuskod.

body

Svarskropp. str UTF-8-kodas; dict / list JSON-kodas och Content-Type ställs in därefter; bytes skickas som det är; ett filliknande objekt eller en asynkron generator strömmas.

status_code

Numerisk HTTP-status. Standard 200.

headers

Dict med svarshuvuden (skiftlägesokänslig).

reason

Anpassad orsaksfras. Standardvärdet är "OK" för 200 och "N/A" annars.

Klassattribut

default_content_type: str

Content-Type som används när ingen anges explicit. Standard 'text/plain'.

default_send_file_max_age: int | None

Värdet Cache-Control: max-age för send_file() när max_age inte anges. None (standard) betyder inget Cache-Control-huvud.

send_file_buffer_size: int

Blockstorlek för strömning med send_file(). Standard 1024.

already_handled: None

Vaktvärde som returneras från hanterare som redan har skrivit svaret direkt (används av WebSocket-uppgraderingar). Alltid None; det är identiteten som spelar roll.

types_map: dict

Karta från filändelse till mime-typ som används av send_file() för härledning av content-type. Mappar css, gif, html, jpg, js, json, png, txt, svg.

Metoder

Lägg till ett Set-Cookie-huvud. expires kan vara en förformaterad sträng eller ett datetime-liknande objekt med timetuple(). Returnerar None; huvudet läggs till i detta svar på plats.

Ställ in en Set-Cookie som omedelbart låter den angivna cookien upphöra. kwargs accepterar samma alternativ som set_cookie() (path, domain, secure, http_only, partitioned); expires och max_age ignoreras. Returnerar None; huvudet läggs till i detta svar på plats.

classmethod redirect(location: str, status_code: int = 302) Response

Returnera ett omdirigeringssvar:

@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

Strömma en fil från filsystemet som svarskropp. content_type härleds från filändelsen via types_map om det inte anges. compressed=True ställer in Content-Encoding: gzip (filen måste redan vara komprimerad).

Varning

filename öppnas direkt. Skicka aldrig en osanerad användartillförd sökväg – att göra det möjliggör godtycklig filröjning.

Undantag

exception microdot.HTTPException

Kastas av abort() för att kortsluta en begäran med en specifik statuskod. Microdot fångar detta och omvandlar det till motsvarande felsvar.

status_code: int

Numerisk HTTP-statuskod att returnera – värdet som skickas till abort().

reason: str

Orsaksfras att inkludera i felsvaret. Om den inte ges till abort() är standardvärdet "<status_code> error" (t.ex. "404 error").

class URLPattern

class microdot.URLPattern(url_pattern: str)

Den kompilerade formen av en rutts URL-mönster. Konstrueras automatiskt av Microdot.route(); applikationer instansierar sällan en direkt.

classmethod register_type(type_name: str, pattern: str = '[^/]+', parser: Callable | None = None) None

Registrera en ny dynamisk-segment-typ för användning i ruttmönster. Returnerar None; typen läggs till i typregistret på klassnivå. Till exempel för att lägga till en <uuid:...>-typ:

URLPattern.register_type('uuid', '[0-9a-f-]{36}')

parser är ett valfritt anropbart objekt som konverterar den infångade strängen innan den når hanteraren.

match(path: str) dict | None

Matcha path mot mönstret och returnera en dict med infångade grupper, eller None vid ingen matchning.

Hjälpklasser

class microdot.MultiDict(initial_dict: dict | None = None)

En dict-underklass som lagrar flera värden per nyckel. Används för frågesträngar och URL-kodade formulärkroppar där samma nyckel kan förekomma mer än en gång (?tag=a&tag=b).

get(key, default=None, type: Callable | None = None)

Returnera det första värdet för key, valfritt konverterat med type (ett anropbart objekt). Returnerar default om nyckeln saknas eller konverteringen misslyckas; annars returneras det (valfritt konverterade) värdet.

getlist(key, type: Callable | None = None) list

Returnera alla värden för key som en lista, valfritt med varje värde konverterat av type. Returnerar en tom lista om key inte finns.

class microdot.NoCaseDict

En dict-underklass med skiftlägesokänsliga strängnycklar. Används för Request.headers och Response.headers.

Funktioner på modulnivå

microdot.abort(status_code: int, reason: str | None = None) None

Genväg för Microdot.abort(). Returnerar aldrig normalt – kastar HTTPException. Importerbar som from microdot import abort.

microdot.redirect(location: str, status_code: int = 302) Response

Genväg för Response.redirect(). Importerbar som from microdot import redirect.

microdot.send_file(filename: str, **kwargs) Response

Genväg för Response.send_file().

microdot.urlencode(s: str) str

Procentkoda en URL-komponent. Ersätter tecken som har reserverad betydelse i en URL (/, ?, &, =, #, mellanslag, …) med deras %xx-hexescaper så att resultatet säkert kan placeras i ett sökvägssegment eller frågevärde. Returnerar den kodade str.

microdot.urldecode(s: str) str

Procentavkoda en URL-komponent – inversen av urlencode(). %xx-escaper ersätts med byten de kodar, och + konverteras till ett mellanslag (den historiska frågesträngskonventionen). Returnerar den avkodade str.

Undermoduler