microdot — minimalny framework HTTP¶
Microdot to mały framework HTTP dla MicroPython, inspirowany Flaskiem. Działa na bazie asyncio, obsługuje wielu równoczesnych klientów bez wątków i udostępnia znajome API oparte na dekoratorach tras. Minimalna aplikacja wygląda następująco:
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¶
Instancja aplikacji HTTP. Jedna instancja jest tworzona w pobliżu początku skryptu i dekorowana procedurami obsługi tras; wywołanie
run()lub oczekiwanie nastart_server()rozpoczyna obsługę.Rejestracja tras
- route(url_pattern: str, methods: list | None = None) Callable¶
Dekorator rejestrujący procedurę obsługi dla url_pattern dla wymienionych metod HTTP (domyślnie
['GET']). Zwraca dekorator, który po zastosowaniu do funkcji rejestruje ją jako procedurę obsługi i zwraca funkcję bez zmian.- url_pattern
Wzorzec ścieżki. Obsługuje segmenty statyczne (
/users) oraz segmenty dynamiczne ujęte w</>. Segmenty dynamiczne akceptują opcjonalny prefiks typu oddzielony:–<int:id>,<path:rest>,<re:[0-9a-f]+:hex>. Domyślnym typem jeststring.- methods
Lista nazw metod HTTP. Jeśli pominięta, dopasowywane jest wyłącznie
GET.
Procedura obsługi jest wywoływana najpierw z obiektem żądania, a następnie z dowolnymi przechwyconymi segmentami dynamicznymi jako argumentami nazwanymi. Wartość zwracana przez procedurę obsługi staje się odpowiedzią HTTP:
Response, ciąg znaków, krotka(body, status_code[, headers])lub dict / list (wysyłane jako JSON).
- get(url_pattern: str) Callable¶
Wygodny alias dla
route(url_pattern, methods=['GET'])– rejestruje dekorowaną funkcję jako procedurę obsługiGETdla url_pattern. Zwraca dekorator.
- post(url_pattern: str) Callable¶
Wygodny alias dla
route(url_pattern, methods=['POST'])– rejestruje dekorowaną funkcję jako procedurę obsługiPOSTdla url_pattern. Zwraca dekorator.
- put(url_pattern: str) Callable¶
Wygodny alias dla
route(url_pattern, methods=['PUT'])– rejestruje dekorowaną funkcję jako procedurę obsługiPUTdla url_pattern. Zwraca dekorator.
- patch(url_pattern: str) Callable¶
Wygodny alias dla
route(url_pattern, methods=['PATCH'])– rejestruje dekorowaną funkcję jako procedurę obsługiPATCHdla url_pattern. Zwraca dekorator.
- delete(url_pattern: str) Callable¶
Wygodny alias dla
route(url_pattern, methods=['DELETE'])– rejestruje dekorowaną funkcję jako procedurę obsługiDELETEdla url_pattern. Zwraca dekorator.
Punkty zaczepienia cyklu życia
- before_request(f: Callable) Callable¶
Dekorator rejestrujący f do uruchomienia przed każdym żądaniem. f przyjmuje obiekt żądania; jego wartość zwracana jest zwykle ignorowana. Aby przerwać przetwarzanie żądania, zwróć
Response(lub wartość, która się na nią konwertuje) – pozostała część potoku jest wtedy pomijana i wysyłana jest ta odpowiedź. Zwraca f bez zmian.
- after_request(f: Callable) Callable¶
Dekorator rejestrujący f do uruchomienia po każdym pomyślnym żądaniu. f przyjmuje
(request, response)i musi zwrócić (ewentualnie zmodyfikowany) obiekt odpowiedzi. Zwraca f bez zmian.
- after_error_request(f: Callable) Callable¶
Dekorator rejestrujący f do uruchomienia po wygenerowaniu przez Microdot odpowiedzi błędu (404, 500, zgłoszony wyjątek itp.). f przyjmuje
(request, response)i musi zwrócić (ewentualnie zmodyfikowany) obiekt odpowiedzi. Zwraca f bez zmian.
- errorhandler(status_code_or_exception_class) Callable¶
Dekorator rejestrujący niestandardową procedurę obsługi dla kodu stanu HTTP lub klasy wyjątku Python. Dla kodów stanu procedura obsługi przyjmuje wyłącznie żądanie; dla klas wyjątków –
(request, exception). Zwraca dekorator.
Montowanie i przerywanie
- mount(subapp: Microdot, url_prefix: str = '', local: bool = False) None¶
Dołącza trasy innej instancji
Microdotpod url_prefix. Gdy local ma wartośćFalse(domyślnie), procedury obsługi before / after / error podaplikacji są również dołączane do aplikacji nadrzędnej. GdyTrue, te procedury obsługi działają wyłącznie dla tras podaplikacji. ZwracaNone.
- static abort(status_code: int, reason: str | None = None) None¶
Zgłoś
HTTPException, aby przerwać bieżące żądanie z podanym kodem stanu. Nigdy nie zwraca wartości w normalny sposób – framework przechwytuje wyjątek i zamienia go na odpowiednią odpowiedź błędu. Wygodne wewnątrz ciał tras: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()
Uruchamianie serwera
- run(host: str = '0.0.0.0', port: int = 5000, debug: bool = False, ssl=None) None¶
Blokuje wywołujący wątek, uruchamia
asyncio.run()nastart_server(). ZwracaNonedopiero po wywołaniushutdown()i zakończeniu pętli nasłuchiwania. Najprostszy sposób na uruchomienie samodzielnej aplikacji: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¶
Uruchamia serwer jako korutynę. Użyj tego podczas integracji z istniejącą pętlą zdarzeń
asyncioobok innych zadań. Korutyna nie zwraca wartości, dopóki nie zostanie wywołaneshutdown()async def main(): await asyncio.gather( app.start_server(port=80), capture_loop(), )
- host
Interfejs sieciowy, na którym ma nasłuchiwać serwer.
'0.0.0.0'(domyślnie) oznacza wszystkie interfejsy;'127.0.0.1'oznacza wyłącznie pętlę zwrotną.- port
Port TCP, na którym ma nasłuchiwać serwer. Domyślnie
5000– wybierz80dla zwykłego HTTP,443dla HTTPS.- debug
Jeśli
True, rejestruje każde żądanie i zrzuca śledzenia stosu na stdout.- ssl
Obiekt
ssl.SSLContextopakowujący przychodzące połączenia w TLS.None(domyślnie) oznacza zwykłe HTTP.- start_serving
Istotne wyłącznie w CPython; ignorowane w MicroPython.
- shutdown() None¶
Żądanie płynnego zamknięcia serwera. Bezpieczne do wywołania z procedury obsługi trasy – bieżące żądanie zostaje ukończone, zanim pętla zakończy działanie. Zwraca natychmiast; faktyczne zamknięcie następuje po zakończeniu trwającego żądania.
Atrybuty
- url_map: list¶
Lista zarejestrowanych tras jako krotki
(methods, URLPattern, handler, url_prefix, subapp).
- before_request_handlers: list¶
Lista wywoływalnych obiektów zarejestrowanych za pomocą
before_request(), w kolejności rejestracji. Każdy uruchamia się z obiektem żądania przed procedurą obsługi trasy. Bezpośrednia modyfikacja listy działa, ale jest rzadko potrzebna – preferuj dekorator.
- after_request_handlers: list¶
Lista wywoływalnych obiektów zarejestrowanych za pomocą
after_request(), w kolejności rejestracji. Każdy uruchamia się z(request, response)po pomyślnym żądaniu i musi zwrócić (ewentualnie zmodyfikowaną) odpowiedź.
- after_error_request_handlers: list¶
Lista wywoływalnych obiektów zarejestrowanych za pomocą
after_error_request(), w kolejności rejestracji. Każdy uruchamia się z(request, response)po wygenerowaniu odpowiedzi błędu (przez framework lub przez procedurę obsługi błędów aplikacji) i musi zwrócić odpowiedź.
- error_handlers: dict¶
Mapowanie kluczy błędów na wywoływalne procedury obsługi, wypełniane przez
errorhandler(). Klucze to albo kody stanu HTTP (int), albo klasy wyjątków Python; wartości to zarejestrowane procedury obsługi. Procedury obsługi kodów stanu przyjmują(request); procedury obsługi klas wyjątków przyjmują(request, exception).
class Request¶
- class microdot.Request¶
Przychodzące żądanie HTTP. Instancje są przekazywane do procedur obsługi tras jako pierwszy argument pozycyjny. Aplikacje nie konstruują
Requestbezpośrednio.Atrybuty klasy
- max_content_length: int¶
Odrzuca żądania, których
Content-Lengthprzekracza tę liczbę bajtów, odpowiedzią 413. Domyślnie 16 KB.
- max_body_length: int¶
Największe ciało, które jest buforowane w pamięci i udostępniane przez
body. Większe ciała (domax_content_length) pozostają w gnieździe i muszą być odczytane przezstream. Domyślnie 16 KB.
- max_readline: int¶
Maksymalna długość pojedynczego wiersza żądania / wiersza nagłówka w bajtach. Domyślnie 2 KB.
Atrybuty instancji
- headers: NoCaseDict¶
Nagłówki żądania jako
NoCaseDict(wyszukiwanie bez rozróżniania wielkości liter).
- g: object¶
Dowolny kontener dla danego żądania (goły obiekt). Przypisz mu atrybuty, aby przekazywać wartości między punktami zaczepienia a procedurami obsługi (
request.g.user = ...).
- route: Callable¶
Funkcja obsługi, która dopasowała się do tego żądania.
Dostęp do ciała
- stream: object¶
Asynchroniczny obiekt strumienia udostępniający
read()nad ciałem. Użyj tego dla ciał większych niżmax_body_length.
- json: dict | list | str | int | float | bool | None¶
Ciało sparsowane jako JSON (
dict,list,str,int,floatlubbool– cokolwiek koduje ładunek) lubNone, jeśliContent-Typenie jestapplication/json.
- form: MultiDict | None¶
Pola formularza zakodowane w URL jako
MultiDictlubNone. Dlamultipart/form-dataudekoruj trasę za pomocąmicrodot.multipart.with_form_data().
- files: dict | None¶
Przesłane pliki jako
{name: FileUpload}, wypełniane przezmicrodot.multipart.with_form_data().Nonedo czasu uruchomienia tego dekoratora.
- after_request(f: Callable) Callable¶
Rejestruje punkt zaczepienia after-request lokalny dla żądania – uruchamia się po procedurach obsługi after-request na poziomie aplikacji, wyłącznie w przypadku powodzenia. f przyjmuje
(request, response)i musi zwrócić (ewentualnie zmodyfikowany) obiekt odpowiedzi. Zwraca f bez zmian.
class Response¶
- class microdot.Response(body=b'', status_code: int = 200, headers: dict | None = None, reason: str | None = None)¶
Odpowiedź HTTP. Większość procedur obsługi zwraca wartości, które Microdot automatycznie konwertuje na
Response; skonstruuj ją bezpośrednio, gdy potrzebujesz niestandardowych nagłówków lub określonego kodu stanu.- body
Ciało odpowiedzi.
strjest kodowany w UTF-8;dict/listjest kodowany jako JSON i odpowiednio ustawiany jestContent-Type;bytesjest wysyłany bez zmian; obiekt plikopodobny lub asynchroniczny generator jest strumieniowany.- status_code
Liczbowy stan HTTP. Domyślnie 200.
- headers
Słownik nagłówków odpowiedzi (bez rozróżniania wielkości liter).
- reason
Niestandardowa fraza przyczyny. Domyślnie
"OK"dla 200 i"N/A"w pozostałych przypadkach.
Atrybuty klasy
- default_content_type: str¶
Content-Type używany, gdy żaden nie jest ustawiony jawnie. Domyślnie
'text/plain'.
- default_send_file_max_age: int | None¶
Wartość
Cache-Control: max-agedlasend_file(), gdymax_agenie jest podane.None(domyślnie) oznacza brak nagłówka Cache-Control.
- send_file_buffer_size: int¶
Rozmiar fragmentu dla strumieniowania
send_file(). Domyślnie 1024.
- already_handled: None¶
Wartownik zwracany przez procedury obsługi, które już bezpośrednio zapisały odpowiedź (używany przez ulepszenia WebSocket). Zawsze
None; liczy się tożsamość.
- types_map: dict¶
Mapa rozszerzeń na typy mime używana przez
send_file()do wnioskowania typu zawartości. Mapujecss,gif,html,jpg,js,json,png,txt,svg.
Metody
- 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¶
Dodaje nagłówek
Set-Cookie. expires może być wstępnie sformatowanym ciągiem lub obiektem przypominającymdatetimeztimetuple(). ZwracaNone; nagłówek jest dołączany do tej odpowiedzi w miejscu.
- delete_cookie(cookie: str, **kwargs) None¶
Ustawia
Set-Cookie, który natychmiast wygasza podane ciasteczko.kwargsprzyjmuje te same opcje coset_cookie()(path,domain,secure,http_only,partitioned);expiresimax_agesą ignorowane. ZwracaNone; nagłówek jest dołączany do tej odpowiedzi w miejscu.
- classmethod redirect(location: str, status_code: int = 302) Response¶
Zwraca odpowiedź przekierowania:
@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¶
Strumieniuje plik z systemu plików jako ciało odpowiedzi.
content_typejest wnioskowany z rozszerzenia za pomocątypes_map, jeśli nie został podany.compressed=TrueustawiaContent-Encoding: gzip(plik musi być już skompresowany).Ostrzeżenie
filename jest otwierany bezpośrednio. Nigdy nie przekazuj nieoczyszczonej ścieżki dostarczonej przez użytkownika – umożliwia to ujawnienie dowolnego pliku.
Wyjątki¶
class URLPattern¶
- class microdot.URLPattern(url_pattern: str)¶
Skompilowana postać wzorca URL trasy. Konstruowana automatycznie przez
Microdot.route(); aplikacje rzadko tworzą ją bezpośrednio.- classmethod register_type(type_name: str, pattern: str = '[^/]+', parser: Callable | None = None) None¶
Rejestruje nowy typ segmentu dynamicznego do użycia we wzorcach tras. Zwraca
None; typ jest dodawany do rejestru typów na poziomie klasy. Na przykład, aby dodać typ<uuid:...>URLPattern.register_type('uuid', '[0-9a-f-]{36}')parser to opcjonalny obiekt wywoływalny, który konwertuje przechwycony ciąg, zanim dotrze on do procedury obsługi.
Klasy pomocnicze¶
- class microdot.MultiDict(initial_dict: dict | None = None)¶
Podklasa dict przechowująca wiele wartości na klucz. Używana dla ciągów zapytań i ciał formularzy zakodowanych w URL, w których ten sam klucz może pojawić się więcej niż raz (
?tag=a&tag=b).
- class microdot.NoCaseDict¶
Podklasa dict z kluczami będącymi ciągami bez rozróżniania wielkości liter. Używana dla
Request.headersiResponse.headers.
Funkcje na poziomie modułu¶
- microdot.abort(status_code: int, reason: str | None = None) None¶
Skrót dla
Microdot.abort(). Nigdy nie zwraca wartości w normalny sposób – zgłaszaHTTPException. Importowalny jakofrom microdot import abort.
- microdot.redirect(location: str, status_code: int = 302) Response¶
Skrót dla
Response.redirect(). Importowalny jakofrom microdot import redirect.
- microdot.send_file(filename: str, **kwargs) Response¶
Skrót dla
Response.send_file().
- microdot.urlencode(s: str) str¶
Koduje komponent URL w postaci procentowej. Zastępuje znaki mające zarezerwowane znaczenie w URL (
/,?,&,=,#, spacja, …) ich szesnastkowymi sekwencjami%xx, dzięki czemu wynik może bezpiecznie znaleźć się wewnątrz segmentu ścieżki lub wartości zapytania. Zwraca zakodowanystr.
- microdot.urldecode(s: str) str¶
Dekoduje komponent URL z postaci procentowej – odwrotność
urlencode(). Sekwencje%xxsą zastępowane bajtem, który kodują, a+jest konwertowany na spację (historyczna konwencja ciągów zapytań). Zwraca zdekodowanystr.
Podmoduły¶
microdot.auth— uwierzytelnianie HTTPmicrodot.cors— Cross-Origin Resource Sharingmicrodot.csrf— ochrona CSRFmicrodot.login— przepływ logowania użytkownikamicrodot.multipart— parsowanie multipart/form-datamicrodot.session— podpisane sesje w ciasteczkachmicrodot.sse— Server-Sent Eventsmicrodot.websocket— obsługa WebSocket