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