microdot — minimal HTTP framework#

Microdot, MicroPython için küçük, Flask’ten esinlenmiş bir HTTP framework’üdür. asyncio üzerinde çalışır, iş parçacıkları olmadan birden fazla eşzamanlı istemciyi yönetir ve tanıdık bir rota-dekoratör API’si sunar. Minimal bir uygulama şöyle görünü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#

Bir HTTP uygulama örneği. Bir örnek, betiğin üst kısmında oluşturulur ve rota işleyicileriyle dekore edilir; run() çağrılması veya start_server() beklenmesi (await) sunmaya başlar.

Rota kaydı

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

Listelenen HTTP metotları altında url_pattern için bir işleyici kaydeden dekoratör (varsayılan ['GET']). Bir fonksiyona uygulandığında onu işleyici olarak kaydeden ve fonksiyonu değiştirmeden döndüren dekoratörü döndürür.

url_pattern

Bir yol deseni. Statik segmentleri (/users) ve < / > içine alınmış dinamik segmentleri destekler. Dinamik segmentler, : ile ayrılan isteğe bağlı bir tür ön eki kabul eder – <int:id>, <path:rest>, <re:[0-9a-f]+:hex>. Varsayılan tür string şeklindedir.

methods

HTTP metot adlarının listesi. Atlanırsa, yalnızca GET eşleştirilir.

İşleyici önce request nesnesiyle, ardından yakalanan herhangi bir dinamik segment ile anahtar kelime argümanları olarak çağrılır. İşleyicinin dönüş değeri HTTP yanıtı olur: bir Response, bir dize, bir (body, status_code[, headers]) demeti veya bir dict / list (JSON olarak gönderilir).

get(url_pattern: str) Callable#

route(url_pattern, methods=['GET']) için kolaylık takma adı – dekore edilen fonksiyonu url_pattern için bir GET işleyicisi olarak kaydeder. Dekoratörü döndürür.

post(url_pattern: str) Callable#

route(url_pattern, methods=['POST']) için kolaylık takma adı – dekore edilen fonksiyonu url_pattern için bir POST işleyicisi olarak kaydeder. Dekoratörü döndürür.

put(url_pattern: str) Callable#

route(url_pattern, methods=['PUT']) için kolaylık takma adı – dekore edilen fonksiyonu url_pattern için bir PUT işleyicisi olarak kaydeder. Dekoratörü döndürür.

patch(url_pattern: str) Callable#

route(url_pattern, methods=['PATCH']) için kolaylık takma adı – dekore edilen fonksiyonu url_pattern için bir PATCH işleyicisi olarak kaydeder. Dekoratörü döndürür.

delete(url_pattern: str) Callable#

route(url_pattern, methods=['DELETE']) için kolaylık takma adı – dekore edilen fonksiyonu url_pattern için bir DELETE işleyicisi olarak kaydeder. Dekoratörü döndürür.

Yaşam döngüsü kancaları

before_request(f: Callable) Callable#

f‘nin her istekten önce çalışmasını kaydeden dekoratör. f request nesnesini alır; dönüş değeri normalde yok sayılır. İsteği kısa devre yaptırmak için bir Response (veya bir tanesine dönüştürülen bir değer) döndürün – bu durumda işlem hattının geri kalanı atlanır ve o yanıt gönderilir. f‘yi değiştirmeden döndürür.

after_request(f: Callable) Callable#

f‘nin her başarılı istekten sonra çalışmasını kaydeden dekoratör. f (request, response) alır ve (muhtemelen değiştirilmiş) response nesnesini döndürmelidir. f‘yi değiştirmeden döndürür.

after_error_request(f: Callable) Callable#

Microdot bir hata yanıtı (404, 500, fırlatılan istisna vb.) ürettikten sonra f‘nin çalışmasını kaydeden dekoratör. f (request, response) alır ve (muhtemelen değiştirilmiş) response nesnesini döndürmelidir. f‘yi değiştirmeden döndürür.

errorhandler(status_code_or_exception_class) Callable#

Bir HTTP durum kodu veya bir Python istisna sınıfı için özel bir işleyici kaydeden dekoratör. Durum kodları için işleyici yalnızca request’i alır; istisna sınıfları için (request, exception) alır. Dekoratörü döndürür.

Bağlama ve iptal etme

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

Başka bir Microdot örneğinin rotalarını url_prefix altında ekler. local False (varsayılan) olduğunda, alt uygulamanın before / after / error işleyicileri de üst uygulamaya eklenir. True olduğunda, bu işleyiciler yalnızca alt uygulama rotaları için çalışır. None döndürür.

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

Geçerli isteği verilen durum koduyla iptal etmek için HTTPException fırlatın. Normal şekilde asla dönmez – framework istisnayı yakalar ve onu karşılık gelen hata yanıtına dönüştürür. Rota gövdelerinin içinde kullanışlıdır:

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

Sunucuyu çalıştırma

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

Çağıran iş parçacığını bloke eder, start_server() üzerinde asyncio.run() çalıştırır. Yalnızca shutdown() çağrıldıktan ve dinleme döngüsü çıktıktan sonra None döndürür. Bağımsız bir uygulamayı başlatmanın en basit yolu:

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#

Sunucuyu bir coroutine olarak başlatır. Bunu, diğer görevlerle birlikte mevcut bir asyncio olay döngüsüyle entegre olurken kullanın. Coroutine, shutdown() çağrılana kadar dönmez:

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

Dinlenecek ağ arayüzü. '0.0.0.0' (varsayılan) tüm arayüzler anlamına gelir; '127.0.0.1' yalnızca loopback anlamına gelir.

port

Dinlenecek TCP portu. Varsayılan 5000 – düz HTTP için 80, HTTPS için 443 seçin.

debug

True ise, her isteği günlüğe kaydeder ve geri izlemeleri (traceback) stdout’a döker.

ssl

Gelen bağlantıları TLS ile sarmalamak için bir ssl.SSLContext. None (varsayılan) düz HTTP anlamına gelir.

start_serving

Yalnızca CPython’da geçerlidir; MicroPython’da yok sayılır.

shutdown() None#

Zarif (graceful) bir sunucu kapatması ister. Bir rota işleyicisinden çağrılması güvenlidir – döngü çıkmadan önce geçerli istek tamamlanır. Hemen döner; gerçek kapatma, devam eden istek bittiğinde gerçekleşir.

Öznitelikler

url_map: list#

Kayıtlı rotaların (methods, URLPattern, handler, url_prefix, subapp) demetleri olarak listesi.

before_request_handlers: list#

before_request() ile kaydedilen çağrılabilirlerin, kayıt sırasına göre listesi. Her biri, rota işleyicisinden önce request nesnesiyle çalışır. Listeyi doğrudan değiştirmek işe yarar ancak nadiren gereklidir – dekoratörü tercih edin.

after_request_handlers: list#

after_request() ile kaydedilen çağrılabilirlerin, kayıt sırasına göre listesi. Her biri, başarılı bir istekten sonra (request, response) ile çalışır ve (muhtemelen değiştirilmiş) yanıtı döndürmelidir.

after_error_request_handlers: list#

after_error_request() ile kaydedilen çağrılabilirlerin, kayıt sırasına göre listesi. Her biri, (framework tarafından veya bir uygulama hata işleyicisi tarafından) bir hata yanıtı üretildikten sonra (request, response) ile çalışır ve yanıtı döndürmelidir.

error_handlers: dict#

errorhandler() tarafından doldurulan, hata anahtarlarının işleyici çağrılabilirlerine eşlemesi. Anahtarlar ya HTTP durum kodları (int) ya da Python istisna sınıflarıdır; değerler kayıtlı işleyicilerdir. Durum kodu işleyicileri (request) alır; istisna sınıfı işleyicileri (request, exception) alır.

debug: bool#

Sunucu debug=True ile çalışırken True.

class Request#

class microdot.Request#

Gelen bir HTTP isteği. Örnekler, rota işleyicilerine ilk konumsal argüman olarak iletilir. Uygulamalar Request‘i doğrudan oluşturmaz.

Sınıf öznitelikleri

max_content_length: int#

Content-Length değeri bu kadar baytı aşan istekleri 413 yanıtıyla reddeder. Varsayılan 16 KB.

max_body_length: int#

Belleğe arabelleğe alınan ve body aracılığıyla sunulan en büyük gövde. Daha büyük gövdeler (max_content_length değerine kadar) soket üzerinde kalır ve stream aracılığıyla okunmalıdır. Varsayılan 16 KB.

max_readline: int#

Tek bir istek satırının / başlık satırının bayt cinsinden maksimum uzunluğu. Varsayılan 2 KB.

Örnek öznitelikleri

app: Microdot#

İsteği işleyen Microdot örneği.

client_addr: tuple#

İstemcinin (host, port) olarak adresi.

method: str#

HTTP metot dizesi ('GET', 'POST', …).

scheme: str#

'http' veya 'https'.

url: str#

Tam istek URL yolu ve sorgu dizesi (host’tan sonraki her şey).

path: str#

Yalnızca yol kısmı.

query_string: str | None#

Ham sorgu dizesi kısmı veya None.

args: MultiDict#

Bir MultiDict olarak ayrıştırılmış sorgu dizesi.

headers: NoCaseDict#

Bir NoCaseDict olarak istek başlıkları (büyük/küçük harf duyarsız arama).

cookies: dict#

Bir dict olarak ayrıştırılmış Cookie başlığı.

content_length: int#

Tam sayı Content-Length değeri veya yoksa 0.

content_type: str | None#

Content-Type başlık değeri veya None.

g: object#

Serbest biçimli, isteğe özgü bir kapsayıcı (boş bir nesne). Kancalar ve işleyiciler arasında değer aktarmak için ona öznitelikler atayın (request.g.user = ...).

route: Callable#

Bu istekle eşleşen işleyici fonksiyon.

url_prefix: str#

Rotanın altına bağlandığı ön ek veya ''.

subapp: Microdot | None#

Bağlı alt uygulama örneği veya None.

Gövdeye erişim

body: bytes#

Tam istek gövdesi bytes olarak. Gövde akışla aktarılırken boştur (bkz. stream).

stream: object#

Gövde üzerinde read() sunan bir asenkron akış nesnesi. Bunu max_body_length değerinden büyük gövdeler için kullanın.

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

JSON olarak ayrıştırılmış gövde (bir dict, list, str, int, float veya bool – yükün kodladığı her ne ise) veya Content-Type application/json değilse None.

form: MultiDict | None#

Bir MultiDict olarak URL-kodlu form alanları veya None. multipart/form-data için rotayı microdot.multipart.with_form_data() ile dekore edin.

files: dict | None#

microdot.multipart.with_form_data() tarafından doldurulan, {name: FileUpload} olarak yüklenen dosyalar. O dekoratör çalışana kadar None.

after_request(f: Callable) Callable#

İsteğe özgü bir after-request kancası kaydeder – uygulama düzeyindeki after-request işleyicilerinden sonra, yalnızca başarı durumunda çalışır. f (request, response) alır ve (muhtemelen değiştirilmiş) response nesnesini döndürmelidir. f‘yi değiştirmeden döndürür.

class Response#

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

Bir HTTP yanıtı. Çoğu işleyici, Microdot’un otomatik olarak bir Response‘a dönüştürdüğü değerler döndürür; özel başlıklara veya belirli bir durum koduna ihtiyacınız olduğunda doğrudan bir tane oluşturun.

body

Yanıt gövdesi. str UTF-8 ile kodlanır; dict / list JSON olarak kodlanır ve Content-Type buna göre ayarlanır; bytes olduğu gibi gönderilir; dosya benzeri bir nesne veya asenkron üreteç akışla aktarılır.

status_code

Sayısal HTTP durumu. Varsayılan 200.

headers

Yanıt başlıklarının sözlüğü (büyük/küçük harf duyarsız).

reason

Özel neden ifadesi. 200 için varsayılan "OK", aksi takdirde "N/A" şeklindedir.

Sınıf öznitelikleri

default_content_type: str#

Hiçbiri açıkça ayarlanmadığında kullanılan Content-Type. Varsayılan 'text/plain'.

default_send_file_max_age: int | None#

max_age verilmediğinde send_file() için Cache-Control: max-age değeri. None (varsayılan) Cache-Control başlığı olmaması anlamına gelir.

send_file_buffer_size: int#

send_file() akışı için yığın boyutu. Varsayılan 1024.

already_handled: None#

Yanıtı doğrudan kendisi yazmış olan işleyicilerden döndürülen nöbetçi değer (WebSocket yükseltmeleri tarafından kullanılır). Her zaman None‘dır; önemli olan kimliğidir.

types_map: dict#

İçerik türü çıkarımı için send_file() tarafından kullanılan uzantıdan mime türüne eşleme. css, gif, html, jpg, js, json, png, txt, svg eşler.

Metotlar

Bir Set-Cookie başlığı ekler. expires, önceden biçimlendirilmiş bir dize veya timetuple() içeren datetime benzeri bir nesne olabilir. None döndürür; başlık bu yanıta yerinde eklenir.

Verilen çerezi hemen sona erdiren bir Set-Cookie ayarlar. kwargs, set_cookie() ile aynı seçenekleri kabul eder (path, domain, secure, http_only, partitioned); expires ve max_age yok sayılır. None döndürür; başlık bu yanıta yerinde eklenir.

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

Bir yönlendirme yanıtı döndürür:

@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#

Dosya sisteminden bir dosyayı yanıt gövdesi olarak akışla aktarır. Verilmezse content_type, types_map aracılığıyla uzantıdan çıkarılır. compressed=True, Content-Encoding: gzip ayarlar (dosya zaten sıkıştırılmış olmalıdır).

Uyarı

filename doğrudan açılır. Asla temizlenmemiş, kullanıcı tarafından sağlanan bir yol geçirmeyin – bunu yapmak rastgele dosya ifşasına izin verir.

İstisnalar#

exception microdot.HTTPException#

Bir isteği belirli bir durum koduyla kısa devre yaptırmak için abort() tarafından fırlatılır. Microdot bunu yakalar ve karşılık gelen hata yanıtına dönüştürür.

status_code: int#

Döndürülecek sayısal HTTP durum kodu – abort()‘a geçirilen değer.

reason: str#

Hata yanıtına dahil edilecek neden ifadesi. abort()‘a verilmezse, varsayılan olarak "<status_code> error" olur (ör. "404 error").

class URLPattern#

class microdot.URLPattern(url_pattern: str)#

Bir rotanın URL deseninin derlenmiş biçimi. Microdot.route() tarafından otomatik olarak oluşturulur; uygulamalar nadiren doğrudan bir tane örnekler.

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

Rota desenlerinde kullanılmak üzere yeni bir dinamik-segment türü kaydeder. None döndürür; tür, sınıf düzeyindeki tür kayıt defterine eklenir. Örneğin bir <uuid:...> türü eklemek için:

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

parser, yakalanan dizeyi işleyiciye ulaşmadan önce dönüştüren isteğe bağlı bir çağrılabilirdir.

match(path: str) dict | None#

path‘i desene karşı eşleştirir ve yakalanan grupların bir dict’ini veya eşleşme yoksa None döndürür.

Yardımcı sınıflar#

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

Anahtar başına birden fazla değer depolayan bir dict alt sınıfı. Aynı anahtarın birden fazla kez görünebildiği sorgu dizeleri ve URL-kodlu form gövdeleri için kullanılır (?tag=a&tag=b).

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

key için ilk değeri döndürür, isteğe bağlı olarak type (bir çağrılabilir) ile dönüştürülür. Anahtar eksikse veya dönüştürme başarısız olursa default döndürür; aksi takdirde (isteğe bağlı olarak dönüştürülmüş) değeri döndürür.

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

key için tüm değerleri bir liste olarak döndürür, isteğe bağlı olarak her değer type ile dönüştürülür. key mevcut değilse boş bir liste döndürür.

class microdot.NoCaseDict#

Büyük/küçük harf duyarsız dize anahtarlarına sahip bir dict alt sınıfı. Request.headers ve Response.headers için kullanılır.

Modül düzeyindeki fonksiyonlar#

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

Microdot.abort() için kısayol. Normal şekilde asla dönmez – HTTPException fırlatır. from microdot import abort olarak içe aktarılabilir.

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

Response.redirect() için kısayol. from microdot import redirect olarak içe aktarılabilir.

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

Response.send_file() için kısayol.

microdot.urlencode(s: str) str#

Bir URL bileşenini yüzde-kodlar. Bir URL’de ayrılmış anlamı olan karakterleri (/, ?, &, =, #, boşluk, …) %xx onaltılık kaçış dizileriyle değiştirir, böylece sonuç güvenli bir şekilde bir yol segmentinin veya sorgu değerinin içinde yer alabilir. Kodlanmış str‘yi döndürür.

microdot.urldecode(s: str) str#

Bir URL bileşenini yüzde-çözer – urlencode()‘un tersi. %xx kaçış dizileri kodladıkları baytla değiştirilir ve + bir boşluğa dönüştürülür (tarihsel sorgu dizesi geleneği). Çözülmüş str‘yi döndürür.

Alt modüller#