
Security News
Another Round of TEA Protocol Spam Floods npm, But It’s Not a Worm
Recent coverage mislabels the latest TEA protocol spam as a worm. Here’s what’s actually happening.
🚀 Yet another ASGI toolkit that delivers. 🚀
Documentation: https://lilya.dev 📚
Source Code: https://github.com/dymmond/lilya
The official supported version is always the latest released.
In the world of ASGI, alternatives are always great to have and no tool serves it all. Lilya, coming from the great inspirations of the ones who paved the way, its a more simple, accurate fast and easy to use Python toolkit/framework that aims for simplicity.
A lot of times you won't be needing a fully fledge Python web framework as it can be overwhelming for some simple tasks, instead you would prefer a simple ASGI toolkit that helps you designing production ready, fast, elegant, maintainable and modular applications.
This is where Lilya places itself.
Almost no hard dependencies, 100% pythonic, fully typed and ready for production.
Lilya comes bearing fruits.
trio and asyncio.If you want just the toolkit/framework.
$ pip install lilya
If you want the Lilya client (for scaffolds, and other useful tools)
$ pip install lilya[standard]
If you wish to use to extra functionalities such as the shell or directives (project scaffold generation to speed up).
$ pip install lilya[cli,ipython] # for ipython shell
$ pip install lilya[cli,ptpython] # for ptpython shell
You can learn more about the client in the documentation.
Or if you want to install everything that will allow you to use all the resources of Lilya, such as some specific middlewares.
$ pip install lilya[all]
You would want to install an ASGI server such as uvicorn or hypercorn as well.
If you are familiar with other Python frameworks and toolkits, Lilya provides you with the same feeling.
A Lilya also uses a native settings system which is something that can be extremely useful for any application.
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),
]
)
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}"})
Is this simple. Although there is a lot to unwrap here. Did you notice the path /{user} not only
does not require a request to be declared and instead, receives a user: str?
Well, Lilya does a lot of internal magic for you. If you don't declare a request, that is not a
problem as it will only pass it if its there.
If you have the path parameter declared in the function handler as well, Lilya will automatically
search for the parameters declared and match them against the path parameters declared in the Path
and inject them for you.
Pretty cool, right? This is just scratching the surface.
Lilya can be considered a framework or a toolkit and the reasoning for it its because each component such as middlewares, permissions, Path, Router... can be seen as an independent ASGI application.
In other words, you can build a middleware or a permission and share those with any other existing ASGI framework out there, meaning, you could design a Lilya application, middlewares, permissions and any other component and re-use them in Esmerald or FastAPI or any other, really.
Lilya is not a full-fledge framework like Esmerald or FastAPI, instead its a lightweight toolkit/framework that can be used to build those as well as working on its own.
Example
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()
To run the application from the example.
$ 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)
Worth mentioning who is helping us.
JetBrains
FAQs
Yet another ASGI toolkit that delivers
We found that lilya demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Recent coverage mislabels the latest TEA protocol spam as a worm. Here’s what’s actually happening.

Security News
PyPI adds Trusted Publishing support for GitLab Self-Managed as adoption reaches 25% of uploads

Research
/Security News
A malicious Chrome extension posing as an Ethereum wallet steals seed phrases by encoding them into Sui transactions, enabling full wallet takeover.