Lilya¶
🚀 Mais uma ferramenta ASGI que entrega. 🚀
Documentação: https://lilya.dev 📚
Código font: https://github.com/dymmond/lilya
A versão oficial suportada é sempre a mais recente lançada.
Motivação¶
No mundo do ASGI, ter alternativas é sempre ótimo e nenhuma ferramenta serve para tudo. Lilya, vindo das grandes inspirações daqueles que abriram caminho, é uma ferramenta/framework Python mais simples, precisa, rápida e fácil de usar que visa a simplicidade.
Muitas vezes, não precisará de uma framework Python completa, pois pode ser avassalador para algumas tarefas simples. Em vez disso, poderá utilizar uma ferramenta ASGI simples que o ajude a desenhar aplicações prontas para produção, rápidas, elegantes, mantíveis e modulares.
É aqui que o Lilya se encaixa.
Com quase nenhuma dependência, 100% pythonico, totalmente tipado e pronto para produção.
O que o Lilya traz?¶
Lilya vem com prendas incluídas.
- Uma toolkit/framework ASGI leve.
- Suporte para HTTP/WebSocket.
- Tarefas em segundo plano.
- Ciclo de vida de eventos (on_startup/on_shutdown e lifespan).
- Sistema de permissões nativo.
- Middlewares (Compressor, CSRF, Session, CORS...).
- Um cliente nativo e opcional client.
- Sistema de controlo de gestão de diretivas para executar scripts personalizados dentro da aplicação.
- Poucas dependências.
- Compatibilidade com
trio
easyncio
. - Sistema de roteamento dinâmico com a ajuda do Include nativo e mínima configuração.
- Sistema de configurações nativo.
Instalação¶
Se deseja apenas o toolkit/framework.
$ pip install lilya
Se desejar utilizar funcionalidades extras como a shell ou diretivas (geração do esqueleto do projecto para acelerar o desenvolvimento inicial).
$ pip install lilya[cli,ipython] # para a shell ipython
$ pip install lilya[cli,ptpython] # para a shell ptpython
Pode aprender mais sobre o cliente na documentação.
Ou se quiser instalar tudo que permitirá usar todos os recursos do Lilya, como alguns middlewares específicos.
$ pip install lilya[all]
Adicional¶
Também vai querer instalar um servidor local ASGI como o uvicorn ou hypercorn.
Início rápido¶
Se está familiarizado com outras frameworks e toolkits Python, o Lilya proporciona a mesma sensação.
O Lilya também utiliza um sistema de configurações nativo, o que pode ser extremamente útil para qualquer aplicação.
A forma normal¶
from lilya.apps import Lilya
from lilya.requests import Request
from lilya.responses import Ok
from lilya.routing import Path
async def welcome():
return Ok({"message": "Welcome to Lilya"})
async def user(user: str):
return Ok({"message": f"Welcome to Lilya, {user}"})
async def user_in_request(request: Request):
user = request.path_params["user"]
return Ok({"message": f"Welcome to Lilya, {user}"})
app = Lilya(
routes=[
Path("/{user}", user),
Path("/in-request/{user}", user_in_request),
Path("/", welcome),
]
)
Utilizando o Lilya decorators¶
from lilya.apps import Lilya
from lilya.requests import Request
from lilya.responses import Ok
app = Lilya()
@app.get("/")
async def welcome():
return Ok({"message": "Welcome to Lilya"})
@app.get("/{user}")
async def user(user: str):
return Ok({"message": f"Welcome to Lilya, {user}"})
@app.get("/in-request/{user}")
async def user_in_request(request: Request):
user = request.path_params["user"]
return Ok({"message": f"Welcome to Lilya, {user}"})
É muito simples. Embora haja muito a perceber aqui. Reparou no caminho /{user}
que não apenas não requer que um request
seja declarado, mas em vez disso, recebe um user: str
?
Bem, o Lilya faz muita magia interna por si. Se não declarar um request
, não há problema, ela só será passada se estiver presente.
Se tiver o parâmetro de caminho declarado na função também, o Lilya automaticamente procurará os parâmetros declarados e comparará com os parâmetros de caminho declarados no Path
e os injetará por si.
Porreiro, não é? Isto é apenas a ponta do iceberg.
Definições¶
O Lilya pode ser considerado uma framework ou uma ferramenta e a razão para isso é porque cada componente, como middlewares, permissões, Path, Router... pode ser visto como uma aplicação ASGI independente.
Noutras palavras, pode construir um middleware ou uma permissão e compartilhá-los com qualquer outra framework ASGI existente, o que significa que poderia criar uma aplicação Lilya, middlewares, permissões e qualquer outro componente e reutilizá-los no Esmerald ou FastAPI ou qualquer outro, na realidade.
O Lilya não é uma framework completa como Esmerald ou FastAPI, em vez disso, é uma toolkit/framework leve que pode ser usada para construir essas frameworks, assim como trabalhar por conta própria.
Exemplo
from lilya.exceptions import PermissionDenied
from lilya.protocols.permissions import PermissionProtocol
from lilya.requests import Request
from lilya.types import ASGIApp, Receive, Scope, Send
class AllowAccess(PermissionProtocol):
def __init__(self, app: ASGIApp, *args, **kwargs):
super().__init__(app, *args, **kwargs)
self.app = app
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
request = Request(scope=scope, receive=receive, send=send)
if "allow-admin" in request.headers:
await self.app(scope, receive, send)
return
raise PermissionDenied()
Executar a aplicação¶
Para executar a aplicação do exemplo.
$ uvicorn myapp:app
INFO: Started server process [140552]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)