microdot — 최소 HTTP 프레임워크

Microdot은 MicroPython을 위한 작고 Flask에서 영감을 받은 HTTP 프레임워크입니다. asyncio 위에서 동작하며, 스레드 없이 여러 개의 동시 클라이언트를 처리하고, 익숙한 라우트 데코레이터 API를 제공합니다. 최소한의 애플리케이션은 다음과 같습니다:

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

HTTP 애플리케이션 인스턴스입니다. 스크립트 상단 근처에서 인스턴스 하나를 생성하고 라우트 핸들러로 데코레이트합니다. run()을 호출하거나 start_server()를 await하면 서빙이 시작됩니다.

라우트 등록

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

나열된 HTTP 메서드(기본값 ['GET'])에 대해 url_pattern의 핸들러를 등록하는 데코레이터입니다. 함수에 적용되면 그 함수를 핸들러로 등록하고 함수를 변경 없이 반환하는 데코레이터를 반환합니다.

url_pattern

경로 패턴입니다. 정적 세그먼트(/users)와 < / >로 둘러싼 동적 세그먼트를 지원합니다. 동적 세그먼트는 :로 구분되는 선택적 타입 접두사를 받습니다 – <int:id>, <path:rest>, <re:[0-9a-f]+:hex>. 기본 타입은 string입니다.

methods

HTTP 메서드 이름의 리스트입니다. 생략하면 GET만 매칭됩니다.

핸들러는 먼저 요청 객체와 함께 호출되고, 그다음 캡처된 동적 세그먼트들이 키워드 인자로 전달됩니다. 핸들러의 반환값이 HTTP 응답이 됩니다: Response, 문자열, 튜플 (body, status_code[, headers]), 또는 dict / list(JSON으로 전송됨).

get(url_pattern: str) Callable

route(url_pattern, methods=['GET'])의 편의 별칭 – 데코레이트된 함수를 url_patternGET 핸들러로 등록합니다. 데코레이터를 반환합니다.

post(url_pattern: str) Callable

route(url_pattern, methods=['POST'])의 편의 별칭 – 데코레이트된 함수를 url_patternPOST 핸들러로 등록합니다. 데코레이터를 반환합니다.

put(url_pattern: str) Callable

route(url_pattern, methods=['PUT'])의 편의 별칭 – 데코레이트된 함수를 url_patternPUT 핸들러로 등록합니다. 데코레이터를 반환합니다.

patch(url_pattern: str) Callable

route(url_pattern, methods=['PATCH'])의 편의 별칭 – 데코레이트된 함수를 url_patternPATCH 핸들러로 등록합니다. 데코레이터를 반환합니다.

delete(url_pattern: str) Callable

route(url_pattern, methods=['DELETE'])의 편의 별칭 – 데코레이트된 함수를 url_patternDELETE 핸들러로 등록합니다. 데코레이터를 반환합니다.

라이프사이클 훅

before_request(f: Callable) Callable

모든 요청 전에 실행되도록 f 를 등록하는 데코레이터입니다. f 는 요청 객체를 인수로 받으며, 그 반환값은 일반적으로 무시됩니다. 요청을 단축 처리하려면 Response (또는 그것으로 변환되는 값)을 반환하십시오. 그러면 파이프라인의 나머지 부분은 건너뛰어지고 해당 응답이 전송됩니다. f 를 변경하지 않고 그대로 반환합니다.

after_request(f: Callable) Callable

성공한 모든 요청 후에 실행되도록 f를 등록하는 데코레이터입니다. f(request, response)를 받으며 (수정되었을 수도 있는) 응답 객체를 반드시 반환해야 합니다. f를 변경 없이 반환합니다.

after_error_request(f: Callable) Callable

Microdot이 오류 응답(404, 500, 발생한 예외 등)을 생성한 후에 실행되도록 f를 등록하는 데코레이터입니다. f(request, response)를 받으며 (수정되었을 수도 있는) 응답 객체를 반드시 반환해야 합니다. f를 변경 없이 반환합니다.

errorhandler(status_code_or_exception_class) Callable

HTTP 상태 코드나 Python 예외 클래스에 대한 사용자 정의 핸들러를 등록하는 데코레이터입니다. 상태 코드의 경우 핸들러는 요청만 받고, 예외 클래스의 경우 (request, exception)을 받습니다. 데코레이터를 반환합니다.

마운트 및 중단

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

다른 Microdot 인스턴스의 라우트를 url_prefix 아래에 부착합니다. localFalse(기본값)이면 서브 앱의 before / after / error 핸들러도 부모에 부착됩니다. True이면 그 핸들러들은 서브 앱 라우트에 대해서만 실행됩니다. None을 반환합니다.

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

주어진 상태 코드로 현재 요청을 중단하려면 HTTPException을 발생시키십시오. 정상적으로 반환하지 않습니다 – 프레임워크가 예외를 잡아 해당하는 오류 응답으로 변환합니다. 라우트 본문 내부에서 편리하게 사용할 수 있습니다:

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

서버 실행

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

호출 스레드를 블록하고 start_server()에 대해 asyncio.run()을 실행합니다. shutdown()이 호출되어 수신 루프가 종료된 후에만 None을 반환합니다. 독립 실행형 앱을 시작하는 가장 간단한 방법입니다:

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

서버를 코루틴으로 시작합니다. 다른 작업들과 함께 기존 asyncio 이벤트 루프에 통합할 때 사용하십시오. 이 코루틴은 shutdown()이 호출될 때까지 반환하지 않습니다:

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

수신할 네트워크 인터페이스입니다. '0.0.0.0'(기본값)은 모든 인터페이스를 의미하고, '127.0.0.1'은 루프백만을 의미합니다.

port

수신할 TCP 포트입니다. 기본값 5000 – 평문 HTTP에는 80, HTTPS에는 443을 선택하십시오.

debug

True이면 모든 요청을 로깅하고 트레이스백을 stdout으로 덤프합니다.

ssl

들어오는 연결을 TLS로 감싸기 위한 ssl.SSLContext 입니다. None (기본값)은 일반 HTTP를 의미합니다.

start_serving

CPython에서만 관련이 있습니다. MicroPython에서는 무시됩니다.

shutdown() None

서버의 정상적인 종료(graceful shutdown)를 요청합니다. 라우트 핸들러에서 호출해도 안전합니다 – 루프가 종료되기 전에 현재 요청이 완료됩니다. 즉시 반환하며, 실제 종료는 진행 중인 요청이 끝난 후에 일어납니다.

속성

url_map: list

등록된 라우트들의 리스트로, (methods, URLPattern, handler, url_prefix, subapp) 튜플 형태입니다.

before_request_handlers: list

before_request()로 등록된 호출 가능 객체들의 리스트로, 등록 순서대로입니다. 각각은 라우트 핸들러 전에 요청 객체와 함께 실행됩니다. 리스트를 직접 변경해도 동작하지만 거의 필요하지 않습니다 – 데코레이터를 사용하는 것이 좋습니다.

after_request_handlers: list

after_request()로 등록된 호출 가능 객체들의 리스트로, 등록 순서대로입니다. 각각은 성공한 요청 후에 (request, response)와 함께 실행되며 (수정되었을 수도 있는) 응답을 반드시 반환해야 합니다.

after_error_request_handlers: list

after_error_request()로 등록된 호출 가능 객체들의 리스트로, 등록 순서대로입니다. 각각은 (프레임워크 또는 애플리케이션 오류 핸들러에 의해) 오류 응답이 생성된 후에 (request, response)와 함께 실행되며 응답을 반드시 반환해야 합니다.

error_handlers: dict

errorhandler()에 의해 채워지는, 오류 키에서 핸들러 호출 가능 객체로의 매핑입니다. 키는 HTTP 상태 코드(int) 또는 Python 예외 클래스이고, 값은 등록된 핸들러입니다. 상태 코드 핸들러는 (request)를 받고, 예외 클래스 핸들러는 (request, exception)을 받습니다.

debug: bool

서버가 debug=True로 실행 중인 동안 True입니다.

class Request

class microdot.Request

들어오는 HTTP 요청입니다. 인스턴스는 첫 번째 위치 인자로 라우트 핸들러에 전달됩니다. 애플리케이션이 Request를 직접 생성하지는 않습니다.

클래스 속성

max_content_length: int

Content-Length가 이 바이트 수를 초과하는 요청을 413 응답으로 거부합니다. 기본값 16 KB.

max_body_length: int

메모리에 버퍼링되어 body를 통해 노출되는 가장 큰 본문입니다. 더 큰 본문(max_content_length까지)은 소켓에 남아 있으며 stream을 통해 읽어야 합니다. 기본값 16 KB.

max_readline: int

단일 요청 라인 / 헤더 라인의 최대 길이(바이트)입니다. 기본값 2 KB.

인스턴스 속성

app: Microdot

요청을 처리하는 Microdot 인스턴스입니다.

client_addr: tuple

클라이언트의 주소로 (host, port) 형태입니다.

method: str

HTTP 메서드 문자열('GET', 'POST', …)입니다.

scheme: str

'http' 또는 'https'입니다.

url: str

전체 요청 URL 경로와 쿼리 문자열(호스트 이후의 모든 것)입니다.

path: str

경로 부분만입니다.

query_string: str | None

원시 쿼리 문자열 부분, 또는 None입니다.

args: MultiDict

MultiDict로 파싱된 쿼리 문자열입니다.

headers: NoCaseDict

대소문자를 구분하지 않고 조회하는 NoCaseDict 형태의 요청 헤더입니다.

cookies: dict

dict로 파싱된 Cookie 헤더입니다.

content_length: int

정수 Content-Length 값, 또는 없으면 0입니다.

content_type: str | None

Content-Type 헤더 값, 또는 None입니다.

g: object

요청별 자유 형식 컨테이너(빈 객체)입니다. 여기에 속성을 할당하여 훅과 핸들러 사이에서 값을 전달하십시오(request.g.user = ...).

route: Callable

이 요청과 매칭된 핸들러 함수입니다.

url_prefix: str

라우트가 마운트된 접두사, 또는 ''입니다.

subapp: Microdot | None

마운트된 서브 앱 인스턴스, 또는 None입니다.

본문 접근

body: bytes

bytes 형태의 전체 요청 본문입니다. 본문이 스트리밍 중일 때는 비어 있습니다(stream 참조).

stream: object

본문에 대한 read()를 노출하는 비동기 스트림 객체입니다. max_body_length보다 큰 본문에 이것을 사용하십시오.

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

JSON으로 파싱된 본문(dict, list, str, int, float, 또는 bool – 페이로드가 인코딩하는 것이라면 무엇이든)이거나, Content-Typeapplication/json이 아니면 None입니다.

form: MultiDict | None

MultiDict로 된 URL 인코딩 폼 필드, 또는 None입니다. multipart/form-data의 경우 라우트를 microdot.multipart.with_form_data()로 데코레이트하십시오.

files: dict | None

{name: FileUpload} 형태의 업로드된 파일들로, microdot.multipart.with_form_data()에 의해 채워집니다. 해당 데코레이터가 실행되기 전까지는 None입니다.

after_request(f: Callable) Callable

요청 로컬 after-request 훅을 등록합니다 – 애플리케이션 수준의 after-request 핸들러 이후에, 성공한 경우에만 실행됩니다. f(request, response)를 받으며 (수정되었을 수도 있는) 응답 객체를 반드시 반환해야 합니다. f를 변경 없이 반환합니다.

class Response

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

HTTP 응답입니다. 대부분의 핸들러는 Microdot이 자동으로 Response로 변환하는 값을 반환합니다. 사용자 정의 헤더나 특정 상태 코드가 필요할 때 직접 생성하십시오.

body

응답 본문입니다. str은 UTF-8로 인코딩되고, dict / list는 JSON으로 인코딩되며 그에 맞게 Content-Type이 설정됩니다. bytes는 그대로 전송되고, 파일류 객체나 비동기 제너레이터는 스트리밍됩니다.

status_code

숫자 HTTP 상태입니다. 기본값 200.

headers

응답 헤더의 dict(대소문자 구분 없음)입니다.

reason

사용자 정의 이유 문구입니다. 200에 대해서는 "OK"로, 그 외에는 "N/A"로 기본 설정됩니다.

클래스 속성

default_content_type: str

명시적으로 설정되지 않았을 때 사용되는 Content-Type입니다. 기본값 'text/plain'.

default_send_file_max_age: int | None

max_age 가 지정되지 않았을 때 send_file() 에 사용되는 Cache-Control: max-age 값입니다. None (기본값)은 Cache-Control 헤더가 없음을 의미합니다.

send_file_buffer_size: int

send_file() 스트리밍의 청크 크기입니다. 기본값 1024.

already_handled: None

응답을 이미 직접 작성한 핸들러에서 반환되는 센티넬입니다(WebSocket 업그레이드에서 사용됨). 항상 None이며, 중요한 것은 그 동일성(identity)입니다.

types_map: dict

send_file()이 콘텐츠 타입 추론에 사용하는 확장자-MIME 타입 맵입니다. css, gif, html, jpg, js, json, png, txt, svg를 매핑합니다.

메서드

Set-Cookie 헤더를 추가합니다. expires는 미리 포맷된 문자열이거나 timetuple()을 가진 datetime류 객체일 수 있습니다. None을 반환하며, 헤더는 이 응답에 제자리에서 추가됩니다.

주어진 쿠키를 즉시 만료시키는 Set-Cookie를 설정합니다. kwargsset_cookie()와 동일한 옵션(path, domain, secure, http_only, partitioned)을 받습니다. expiresmax_age는 무시됩니다. None을 반환하며, 헤더는 이 응답에 제자리에서 추가됩니다.

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

리디렉션 응답을 반환합니다:

@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

파일시스템의 파일을 응답 본문으로 스트리밍합니다. content_type은 주어지지 않으면 types_map을 통해 확장자로부터 추론됩니다. compressed=TrueContent-Encoding: gzip을 설정합니다(파일은 이미 압축되어 있어야 합니다).

경고

filename은 직접 열립니다. 살균(sanitize)되지 않은 사용자 제공 경로를 절대 전달하지 마십시오 – 그렇게 하면 임의 파일 노출이 허용됩니다.

예외

exception microdot.HTTPException

abort()에 의해 발생하여 특정 상태 코드로 요청을 단락(short-circuit)합니다. Microdot이 이것을 잡아 해당하는 오류 응답으로 변환합니다.

status_code: int

반환할 숫자 HTTP 상태 코드 – abort()에 전달된 값입니다.

reason: str

오류 응답에 포함할 이유 문구입니다. abort()에 주어지지 않으면 "<status_code> error"(예: "404 error")로 기본 설정됩니다.

class URLPattern

class microdot.URLPattern(url_pattern: str)

라우트의 URL 패턴을 컴파일한 형태입니다. Microdot.route()에 의해 자동으로 생성되며, 애플리케이션이 직접 인스턴스화하는 경우는 드뭅니다.

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

라우트 패턴에서 사용할 새 동적 세그먼트 타입을 등록합니다. None을 반환하며, 타입은 클래스 수준 타입 레지스트리에 추가됩니다. 예를 들어 <uuid:...> 타입을 추가하려면:

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

parser는 캡처된 문자열이 핸들러에 도달하기 전에 변환하는 선택적 호출 가능 객체입니다.

match(path: str) dict | None

path를 패턴에 대해 매칭하고 캡처된 그룹의 dict를 반환하거나, 매칭되지 않으면 None을 반환합니다.

헬퍼 클래스

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

키당 여러 값을 저장하는 dict 서브클래스입니다. 같은 키가 두 번 이상 나타날 수 있는 쿼리 문자열과 URL 인코딩 폼 본문(?tag=a&tag=b)에 사용됩니다.

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

key에 대한 첫 번째 값을 반환하며, 선택적으로 type(호출 가능 객체)으로 변환합니다. 키가 없거나 변환이 실패하면 default를 반환하고, 그렇지 않으면 (선택적으로 변환된) 값을 반환합니다.

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

key에 대한 모든 값을 리스트로 반환하며, 선택적으로 각 값을 type으로 변환합니다. key가 없으면 빈 리스트를 반환합니다.

class microdot.NoCaseDict

대소문자 구분 없는 문자열 키를 가진 dict 서브클래스입니다. Request.headersResponse.headers에 사용됩니다.

모듈 수준 함수

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

Microdot.abort()의 단축입니다. 정상적으로 반환하지 않습니다 – HTTPException을 발생시킵니다. from microdot import abort로 임포트할 수 있습니다.

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

Response.redirect()의 단축입니다. from microdot import redirect로 임포트할 수 있습니다.

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

Response.send_file()의 단축입니다.

microdot.urlencode(s: str) str

URL 구성 요소를 퍼센트 인코딩합니다. URL에서 예약된 의미를 갖는 문자들(/, ?, &, =, #, 공백, …)을 그 %xx 16진수 이스케이프로 대체하여 결과가 경로 세그먼트나 쿼리 값 안에 안전하게 들어갈 수 있도록 합니다. 인코딩된 str을 반환합니다.

microdot.urldecode(s: str) str

URL 구성 요소를 퍼센트 디코딩합니다 – urlencode()의 역연산입니다. %xx 이스케이프는 그것이 인코딩하는 바이트로 대체되고, +는 공백으로 변환됩니다(전통적인 쿼리 문자열 관례). 디코딩된 str을 반환합니다.

서브모듈