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 ärstring.- 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 enGET-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 enPOST-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 enPUT-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 enPATCH-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 enDELETE-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 ärFalse(standard) ansluts delapplikationens before / after / error-hanterare även till föräldern. NärTruekörs dessa hanterare endast för delapplikationens rutter. ReturnerarNone.
- static abort(status_code: int, reason: str | None = None) None¶
Kasta
HTTPExceptionfö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()påstart_server(). ReturnerarNoneförst efter attshutdown()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änshutdown()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älj80för vanlig HTTP,443för HTTPS.- debug
Om
True, logga varje begäran och dumpa stackspårningar till stdout.- ssl
Ett
ssl.SSLContextfö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).
class Request¶
- class microdot.Request¶
En inkommande HTTP-begäran. Instanser skickas till rutthanterare som det första positionsargumentet. Applikationer konstruerar inte
Requestdirekt.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 tillmax_content_length) stannar kvar på socketen och måste läsas viastream. Standard 16 KB.
Instansattribut
- headers: NoCaseDict¶
Begärandehuvuden som en
NoCaseDict(skiftlägesokänslig uppslagning).
- 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.
Åtkomst till kropp
- stream: object¶
Ett asynkront strömobjekt som exponerar
read()över kroppen. Använd detta för kroppar större änmax_body_length.
- json: dict | list | str | int | float | bool | None¶
Kroppen tolkad som JSON (en
dict,list,str,int,floatellerbool– vad än nyttolasten kodar), ellerNoneomContent-Typeinte ärapplication/json.
- form: MultiDict | None¶
URL-kodade formulärfält som en
MultiDict, ellerNone. Förmultipart/form-data, dekorera rutten medmicrodot.multipart.with_form_data().
- files: dict | None¶
Uppladdade filer som
{name: FileUpload}, fylls avmicrodot.multipart.with_form_data().Nonetills 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.
strUTF-8-kodas;dict/listJSON-kodas ochContent-Typeställs in därefter;bytesskickas 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-ageförsend_file()närmax_ageinte 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. Mapparcss,gif,html,jpg,js,json,png,txt,svg.
Metoder
- 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¶
Lägg till ett
Set-Cookie-huvud. expires kan vara en förformaterad sträng eller ettdatetime-liknande objekt medtimetuple(). ReturnerarNone; huvudet läggs till i detta svar på plats.
- delete_cookie(cookie: str, **kwargs) None¶
Ställ in en
Set-Cookiesom omedelbart låter den angivna cookien upphöra.kwargsaccepterar samma alternativ somset_cookie()(path,domain,secure,http_only,partitioned);expiresochmax_ageignoreras. ReturnerarNone; 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_typehärleds från filändelsen viatypes_mapom det inte anges.compressed=Trueställer inContent-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¶
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.
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).
- class microdot.NoCaseDict¶
En dict-underklass med skiftlägesokänsliga strängnycklar. Används för
Request.headersochResponse.headers.
Funktioner på modulnivå¶
- microdot.abort(status_code: int, reason: str | None = None) None¶
Genväg för
Microdot.abort(). Returnerar aldrig normalt – kastarHTTPException. Importerbar somfrom microdot import abort.
- microdot.redirect(location: str, status_code: int = 302) Response¶
Genväg för
Response.redirect(). Importerbar somfrom 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 kodadestr.
- 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 avkodadestr.
Undermoduler¶
microdot.auth— HTTP-autentiseringmicrodot.cors— Cross-Origin Resource Sharingmicrodot.csrf— CSRF-skyddmicrodot.login— användarinloggningsflödemicrodot.multipart— tolkning av multipart/form-datamicrodot.session— signerade cookie-sessionermicrodot.sse— Server-Sent Eventsmicrodot.websocket— WebSocket-stöd