microdot — minimális HTTP keretrendszer¶
A Microdot egy kicsi, Flask által inspirált HTTP keretrendszer MicroPythonhoz. Az asyncio tetején fut, szálak nélkül kezel több egyidejű klienst, és ismerős route-dekorátor API-t kínál. Egy minimális alkalmazás így néz ki:
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¶
Egy HTTP alkalmazáspéldány. Egy példányt a szkript elején hozunk létre, és route-kezelőkkel látunk el; a
run()hívása vagy astart_server()bevárása indítja el a kiszolgálást.Route-regisztráció
- route(url_pattern: str, methods: list | None = None) Callable¶
Dekorátor, amely a url_pattern mintához regisztrál egy kezelőt a felsorolt HTTP metódusok alatt (alapértelmezés
['GET']). Visszaadja azt a dekorátort, amely egy függvényre alkalmazva azt kezelőként regisztrálja, és változatlanul visszaadja a függvényt.- url_pattern
Egy útvonalminta. Támogat statikus szegmenseket (
/users) és</>közé zárt dinamikus szegmenseket. A dinamikus szegmensek elfogadnak egy opcionális típus-előtagot, amelyet:választ el –<int:id>,<path:rest>,<re:[0-9a-f]+:hex>. Az alapértelmezett típus astring.- methods
HTTP metódusnevek listája. Ha kimarad, csak a
GETilleszkedik.
A kezelő először a kérésobjektummal hívódik meg, majd az elkapott dinamikus szegmensekkel kulcsszó-argumentumként. A kezelő visszatérési értéke lesz a HTTP-válasz: egy
Response, egy karakterlánc, egy(body, status_code[, headers])tuple, vagy egy dict / list (JSON-ként elküldve).
- get(url_pattern: str) Callable¶
Kényelmi alias a
route(url_pattern, methods=['GET'])számára – a dekorált függvényt a url_patternGETkezelőjeként regisztrálja. Visszaadja a dekorátort.
- post(url_pattern: str) Callable¶
Kényelmi alias a
route(url_pattern, methods=['POST'])számára – a dekorált függvényt a url_patternPOSTkezelőjeként regisztrálja. Visszaadja a dekorátort.
- put(url_pattern: str) Callable¶
Kényelmi alias a
route(url_pattern, methods=['PUT'])számára – a dekorált függvényt a url_patternPUTkezelőjeként regisztrálja. Visszaadja a dekorátort.
- patch(url_pattern: str) Callable¶
Kényelmi alias a
route(url_pattern, methods=['PATCH'])számára – a dekorált függvényt a url_patternPATCHkezelőjeként regisztrálja. Visszaadja a dekorátort.
- delete(url_pattern: str) Callable¶
Kényelmi alias a
route(url_pattern, methods=['DELETE'])számára – a dekorált függvényt a url_patternDELETEkezelőjeként regisztrálja. Visszaadja a dekorátort.
Életciklus-horgok
- before_request(f: Callable) Callable¶
Dekorátor, amely az f függvényt minden kérés előtt futtatandóra regisztrálja. Az f a kérésobjektumot kapja meg; a visszatérési értékét általában figyelmen kívül hagyja. A kérés rövidre zárásához adjon vissza egy
Responseobjektumot (vagy olyan értéket, amely azzá alakul) – ekkor a folyamat többi része kimarad, és az a válasz kerül elküldésre. Visszaadja az f függvényt változatlanul.
- after_request(f: Callable) Callable¶
Dekorátor, amely az f függvényt minden sikeres kérés után futtatandóra regisztrálja. Az f a
(request, response)paramétereket kapja, és vissza kell adnia a (esetleg módosított) válaszobjektumot. Visszaadja az f függvényt változatlanul.
- after_error_request(f: Callable) Callable¶
Dekorátor, amely az f függvényt azután futtatandóra regisztrálja, hogy a Microdot hibaválaszt generál (404, 500, kiváltott kivétel stb.). Az f a
(request, response)paramétereket kapja, és vissza kell adnia a (esetleg módosított) válaszobjektumot. Visszaadja az f függvényt változatlanul.
- errorhandler(status_code_or_exception_class) Callable¶
Dekorátor, amely egyéni kezelőt regisztrál egy HTTP státuszkódhoz vagy egy Python kivételosztályhoz. Státuszkódok esetén a kezelő csak a kérést kapja; kivételosztályok esetén a
(request, exception)paramétereket. Visszaadja a dekorátort.
Csatolás és megszakítás
- mount(subapp: Microdot, url_prefix: str = '', local: bool = False) None¶
Egy másik
Microdotpéldány route-jainak csatolása a url_prefix alá. Ha a local értékeFalse(alapértelmezés), az al-alkalmazás before / after / error kezelői a szülőhöz is csatolásra kerülnek. HaTrue, ezek a kezelők csak az al-alkalmazás route-jaira futnak. Visszaadja aNoneértéket.
- static abort(status_code: int, reason: str | None = None) None¶
Váltson ki
HTTPExceptionkivételt az aktuális kérés megszakításához a megadott státuszkóddal. Soha nem tér vissza normálisan – a keretrendszer elkapja a kivételt, és a megfelelő hibaválasszá alakítja. Kényelmes a route-törzseken belül: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()
A kiszolgáló futtatása
- run(host: str = '0.0.0.0', port: int = 5000, debug: bool = False, ssl=None) None¶
Blokkolja a hívó szálat, és lefuttatja az
asyncio.run()függvényt astart_server()metóduson. Csak ashutdown()meghívása és a figyelő ciklus kilépése után ad visszaNoneértéket. A legegyszerűbb mód egy önálló alkalmazás elindítására: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¶
Indítsa el a kiszolgálót korutinként. Ezt akkor használja, amikor egy meglévő
asyncioeseményhurokba integrálja más feladatok mellé. A korutin csak ashutdown()meghívásáig nem tér vissza:async def main(): await asyncio.gather( app.start_server(port=80), capture_loop(), )
- host
A hálózati interfész, amelyen figyelni kell. A
'0.0.0.0'(alapértelmezés) az összes interfészt jelenti; a'127.0.0.1'csak a loopbacket.- port
A figyelendő TCP port. Alapértelmezés
5000– válassza a80portot egyszerű HTTP-hez, a443portot HTTPS-hez.- debug
Ha
True, minden kérést naplóz, és a hibakövetéseket a stdoutra írja.- ssl
Egy
ssl.SSLContext, amely a beérkező kapcsolatokat TLS-be csomagolja. ANone(alapértelmezés) egyszerű HTTP-t jelent.- start_serving
Csak CPythonon releváns; MicroPythonon figyelmen kívül marad.
- shutdown() None¶
Kérje a kiszolgáló elegáns leállítását. Biztonságosan hívható route-kezelőből – az aktuális kérés befejeződik, mielőtt a hurok kilép. Azonnal visszatér; a tényleges leállás akkor történik, amikor a folyamatban lévő kérés befejeződik.
Attribútumok
- url_map: list¶
A regisztrált route-ok listája
(methods, URLPattern, handler, url_prefix, subapp)tuple-ökként.
- before_request_handlers: list¶
A
before_request()segítségével regisztrált hívhatók listája regisztrációs sorrendben. Mindegyik a kérésobjektummal fut le a route-kezelő előtt. A lista közvetlen módosítása működik, de ritkán szükséges – inkább a dekorátort használja.
- after_request_handlers: list¶
A
after_request()segítségével regisztrált hívhatók listája regisztrációs sorrendben. Mindegyik a(request, response)paraméterekkel fut egy sikeres kérés után, és vissza kell adnia a (esetleg módosított) választ.
- after_error_request_handlers: list¶
A
after_error_request()segítségével regisztrált hívhatók listája regisztrációs sorrendben. Mindegyik a(request, response)paraméterekkel fut, miután egy hibaválasz generálódik (a keretrendszer vagy egy alkalmazás-hibakezelő által), és vissza kell adnia a választ.
- error_handlers: dict¶
Hibakulcsok hozzárendelése kezelő hívhatókhoz, amelyet az
errorhandler()tölt fel. A kulcsok vagy HTTP státuszkódok (int), vagy Python kivételosztályok; az értékek a regisztrált kezelők. A státuszkód-kezelők a(request)paramétert kapják; a kivételosztály-kezelők a(request, exception)paramétereket.
class Request¶
- class microdot.Request¶
Egy beérkező HTTP kérés. A példányok a route-kezelőknek az első pozícionális argumentumként kerülnek átadásra. Az alkalmazások nem hozzák létre közvetlenül a
Requestobjektumot.Osztályattribútumok
- max_content_length: int¶
Az olyan kérések elutasítása 413-as válasszal, amelyek
Content-Lengthértéke meghaladja ezt a bájtszámot. Alapértelmezés 16 KB.
- max_body_length: int¶
A legnagyobb törzs, amely a memóriába kerül pufferelésre, és a
bodyattribútumon keresztül érhető el. A nagyobb törzsek (amax_content_lengthértékéig) a socketen maradnak, és astreamattribútumon keresztül kell beolvasni. Alapértelmezés 16 KB.
Példányattribútumok
- headers: NoCaseDict¶
A kérés fejlécei
NoCaseDictformában (kis- és nagybetűre érzéketlen keresés).
- g: object¶
Egy szabad formátumú, kérésenkénti tároló (egy üres objektum). Rendeljen hozzá attribútumokat, hogy értékeket adjon át a horgok és kezelők között (
request.g.user = ...).
- route: Callable¶
A kezelőfüggvény, amely illeszkedett erre a kérésre.
Törzs-hozzáférés
- stream: object¶
Egy aszinkron stream-objektum, amely
read()műveletet kínál a törzs felett. Ezt használja amax_body_lengthértéknél nagyobb törzsekhez.
- json: dict | list | str | int | float | bool | None¶
A JSON-ként elemzett törzs (egy
dict,list,str,int,floatvagybool– bármi, amit a payload kódol), vagyNone, ha aContent-Typenemapplication/json.
- form: MultiDict | None¶
URL-kódolt űrlapmezők
MultiDictformában, vagyNone. Amultipart/form-dataesetén lássa el a route-ot amicrodot.multipart.with_form_data()dekorátorral.
- files: dict | None¶
Feltöltött fájlok
{name: FileUpload}formában, amelyet amicrodot.multipart.with_form_data()tölt fel.None, amíg az a dekorátor le nem fut.
- after_request(f: Callable) Callable¶
Egy kérés-lokális after-request horog regisztrálása – az alkalmazásszintű after-request kezelők után fut, csak siker esetén. Az f a
(request, response)paramétereket kapja, és vissza kell adnia a (esetleg módosított) válaszobjektumot. Visszaadja az f függvényt változatlanul.
class Response¶
- class microdot.Response(body=b'', status_code: int = 200, headers: dict | None = None, reason: str | None = None)¶
Egy HTTP válasz. A legtöbb kezelő olyan értékeket ad vissza, amelyeket a Microdot automatikusan
Responseobjektummá alakít; közvetlenül akkor hozzon létre egyet, ha egyéni fejlécekre vagy konkrét státuszkódra van szüksége.- body
Válasz törzse. A
strUTF-8 kódolású; adict/listJSON-kódolású, és aContent-Typeennek megfelelően van beállítva; abytesváltozatlanul kerül elküldésre; egy fájlszerű objektum vagy aszinkron generátor streamel.- status_code
Numerikus HTTP státusz. Alapértelmezés 200.
- headers
A válasz fejléceinek dict-je (kis- és nagybetűre érzéketlen).
- reason
Egyéni indokló szöveg. Alapértelmezés
"OK"a 200 esetén, egyébként"N/A".
Osztályattribútumok
- default_content_type: str¶
Az alapértelmezett Content-Type, amikor egy sincs explicit módon beállítva. Alapértelmezés
'text/plain'.
- default_send_file_max_age: int | None¶
A
Cache-Control: max-ageérték asend_file()számára, amikor amax_agenincs megadva. ANone(alapértelmezés) azt jelenti, hogy nincs Cache-Control fejléc.
- send_file_buffer_size: int¶
A darabméret a
send_file()streameléséhez. Alapértelmezés 1024.
- already_handled: None¶
Az olyan kezelőkből visszaadott jelzőérték, amelyek már közvetlenül megírták a választ (WebSocket-frissítések használják). Mindig
None; az identitása számít.
- types_map: dict¶
A kiterjesztés-mime-típus leképezés, amelyet a
send_file()használ a tartalomtípus következtetéséhez. Acss,gif,html,jpg,js,json,png,txt,svgkiterjesztéseket képezi le.
Metódusok
- 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¶
Egy
Set-Cookiefejléc hozzáadása. Az expires lehet egy előre formázott karakterlánc vagy egydatetime-szerű objektumtimetuple()metódussal. Visszaadja aNoneértéket; a fejléc helyben hozzáfűződik ehhez a válaszhoz.
- delete_cookie(cookie: str, **kwargs) None¶
Egy
Set-Cookiebeállítása, amely a megadott sütit azonnal lejáratja. Akwargsugyanazokat az opciókat fogadja el, mint aset_cookie()(path,domain,secure,http_only,partitioned); azexpiresés amax_agefigyelmen kívül marad. Visszaadja aNoneértéket; a fejléc helyben hozzáfűződik ehhez a válaszhoz.
- classmethod redirect(location: str, status_code: int = 302) Response¶
Egy átirányítási válasz visszaadása:
@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¶
Egy fájl streamelése a fájlrendszerből a válasz törzseként. A
content_typea kiterjesztésből kerül következtetésre atypes_mapsegítségével, ha nincs megadva. Acompressed=Truebeállítja aContent-Encoding: gzipfejlécet (a fájlnak már tömörítettnek kell lennie).Figyelem
A filename közvetlenül kerül megnyitásra. Soha ne adjon át fertőtlenítetlen, felhasználó által megadott útvonalat – ez tetszőleges fájl felfedését teszi lehetővé.
Kivételek¶
class URLPattern¶
- class microdot.URLPattern(url_pattern: str)¶
Egy route URL-mintájának fordított formája. Automatikusan jön létre a
Microdot.route()által; az alkalmazások ritkán példányosítanak egyet közvetlenül.- classmethod register_type(type_name: str, pattern: str = '[^/]+', parser: Callable | None = None) None¶
Egy új dinamikus-szegmens típus regisztrálása route-mintákban való használatra. Visszaadja a
Noneértéket; a típus hozzáadódik az osztályszintű típusnyilvántartáshoz. Például egy<uuid:...>típus hozzáadásához:URLPattern.register_type('uuid', '[0-9a-f-]{36}')A parser egy opcionális hívható, amely az elkapott karakterláncot átalakítja, mielőtt az eléri a kezelőt.
Segédosztályok¶
- class microdot.MultiDict(initial_dict: dict | None = None)¶
Egy dict alosztály, amely kulcsonként több értéket tárol. Lekérdezési karakterláncokhoz és URL-kódolt űrlaptörzsekhez használatos, ahol ugyanaz a kulcs egynél többször is megjelenhet (
?tag=a&tag=b).
- class microdot.NoCaseDict¶
Egy dict alosztály kis- és nagybetűre érzéketlen karakterlánc-kulcsokkal. A
Request.headersés aResponse.headershasználja.
Modulszintű függvények¶
- microdot.abort(status_code: int, reason: str | None = None) None¶
Gyorsbillentyű a
Microdot.abort()számára. Soha nem tér vissza normálisan –HTTPExceptionkivételt vált ki. Importálhatófrom microdot import abortformában.
- microdot.redirect(location: str, status_code: int = 302) Response¶
Gyorsbillentyű a
Response.redirect()számára. Importálhatófrom microdot import redirectformában.
- microdot.send_file(filename: str, **kwargs) Response¶
Gyorsbillentyű a
Response.send_file()számára.
- microdot.urlencode(s: str) str¶
Egy URL-komponens százalék-kódolása. Az URL-ben fenntartott jelentéssel bíró karaktereket (
/,?,&,=,#, szóköz, …) lecseréli a%xxhexadecimális escape-jeikre, hogy az eredmény biztonságosan elférjen egy útvonal-szegmensen vagy lekérdezési értéken belül. Visszaadja a kódoltstrértéket.
- microdot.urldecode(s: str) str¶
Egy URL-komponens százalék-dekódolása – az
urlencode()inverze. A%xxescape-ek lecserélődnek az általuk kódolt bájtra, és a+szóközre alakul (a régi lekérdezési karakterlánc konvenció). Visszaadja a dekódoltstrértéket.
Almodulok¶
microdot.auth— HTTP-hitelesítésmicrodot.cors— Cross-Origin Resource Sharingmicrodot.csrf— CSRF-védelemmicrodot.login— felhasználói bejelentkezési folyamatmicrodot.multipart— multipart/form-data feldolgozásmicrodot.session— aláírt süti-munkamenetekmicrodot.sse— Server-Sent Eventsmicrodot.websocket— WebSocket támogatás