Handlers

Visão geral

Handlers are functions responsible for handling received requests. They are defined through the @get, @post, @put, @patch, @delete and @websocket decorators.

Handlers deve receber, pelo menos, o objeto da requisição como primeiro parâmetro. Não é necessário anotar o parâmetro da requisição, mas ele deve ser o primeito parâmetro.

import structlog
from asgikit import Request
from zayt.web import get, post

logger = structlog.get_logger(__name__)


@get
async def index(request: Request):
    await request.respond_text("application root")


@post("send")
async def handle_data(request: Request):
    content = await request.body.read_json()
    logger.info("request body: ", content=repr(content))
    await request.redirect("/")

Nota

Definir um caminho em @get @post etc... é opcional e tem como padrão uma string vazia.

Funções handler pode ser definidas com parâmetros de caminho, que podem ser recuperados através da propriedade asgikit.Request.path_params:

from zayt.web import Request, get


@get("/{path_param}")
def handler(request: Request):
    path_param = request.path_params["path_param"]

A seção routing section provê mais informações a respeito de parâmetros de caminho

Respostas

Handlers não retornam uma resposta. Ao invés disso, ele chamam um dos métodos respond_* do objeto asgikit.Request para responder à requisição.

from asgikit import Request
from zayt.web import get


@get
async def handler(request: Request):
    await request.respond_json({"data": "The response"})

Os métodos respond_* da classe asgikit.Request são, na verdade, proxies para os métodos na classe asgikit.Response

Dependências

Funções handler podem receber serviços como parâmetros que serão injetados quando o handler for chamado.

from zayt.di import service
from zayt.web import get


@service
class MyService:
    pass


@get
def my_handler(request, my_service: MyService):
    ...

Parâmetros do handler podem ser anotados com Inject para customizar a dependência:

from typing import Annotated
from zayt.di import Inject, service
from zayt.web import get


@service(name="named-service")
class MyService:
    pass


@get
def my_handler(
    request,
    my_service: Annotated[MyService, Inject(name="named-service")]
):
    ...

Dados da requisição

Pelo objeto da requisição você pode recuperar dados como o caminho, método, cabeçalhos, etc.

from http import HTTPMethod, HTTPStatus
from asgikit import Request, WebSocket
from zayt.web import get, websocket


@get
async def handler(request: Request):
    assert request.method == HTTPMethod.GET
    assert request.path == "/"
    body = await request.json()
    await request.respond_json({"status": HTTPStatus.OK})